Învăţăm PHP: Despre date()


Cred că nu este pagină pe care o încarc mai des din documentaţia PHP ca pagina despre funcţia date() (o găsiţi aici) De ce? Pentru că nu am reuşit – încă :) – să reţin pe de rost decât unele formatări mai comune. Dar la urma urmelor de ce să mă chinui să memorez când dintr-un click pot revedea detaliile? Oficial funcţia este explicată astfel: date($formatare,$timp) întoarce un string formatat în conformitate cu stringul de formatare dat, utilizând timpul indicat, sau data şi ora curentă dacă nu este furnizat nici un timp.

Totul este deci să ştiţi cum formataţi data în primul argument al funcţiei. De exemplu date(‘Y’) va returna anul în care ne aflăm. În schimb date(‘H:i:s’) va da ora, minutele şi secundele (în format 04:01:03, adică cu zero în faţă dacă e cazul). O simplă schimbare poate fi foarte importantă: H e pentru reprezentarea orei în format de 24 ore, cu zero la început, pe când h e pentru reprezentarea orei în format de 12 ore, cu zero la început. Prima linie din codul de mai jos va afişa ziua (numele ei), data luna anul şi apoi ora minutele şi secundele. Evident în engleză (vezi comentariul la articolul precedent, pentru alternative la engleză). Putem să facem noi o „traducere”, definindu-ne array-uri pentru zile şi luni. Observaţi că la zile am început de la duminică (cu w se returnează ziua din săptămână, ca număr, duminica fiind 0, urmând luni 1 până la sâmbătă 6), în timp ce la luni am pus un string vid pe poziţia zero (cu n obţinem lunile, ca număr, ianuarie fiind 1 şi aşa mai departe până la decembrie 12).

Ca să nu uităm de funcţii, am făcut apoi o funcţie care să simplifice afişarea datei pre limba noastră. O apelăm în liniile 14-16 unde, observaţi, furnizăm un anumit timp cu care putem jongla uşor. Priviţi cât de uşor se poate afişa o dată de peste n luni sau m zile. (Reţineţi că este data şi ora serverului, care în acest moment e în SUA.)

[PHP]echo date(‘l, j F Y @ H:i:s’).’
‘;
echo ‘Today is ‘.date(‘l, j F Y’).’.
‘;
$zile=array(„duminica”,”luni”,”marti”,”miercuri”,”joi”,”vineri”,”sambata”);
$luni=array(„”,”ianuarie”,”februarie”,”martie”,”aprilie”,”mai”,”iunie”,
„iulie”,”august”,”septembrie”,”octombrie”,”noiembrie”,”decembrie”);
echo ‘Astazi este ‘.$zile[date(‘w’)].’, ‘.date(‘j’).’ ‘.$luni[date(‘n’)].’ ‘.date(‘Y’).’.
‘;
echo ‘
‘;

function dataRomana($timp){
global $zile,$luni;
return $zile[date(‘w’,$timp)].’, ‘.date(‘j’,$timp).’ ‘.
$luni[date(‘n’,$timp)].’ ‘.date(‘Y’,$timp);
}

echo ’20 octombrie 2005: ‘.dataRomana(mktime(0,0,0,10,20,2005)).’.
‘;
echo ‘Plus trei luni: ‘.dataRomana(mktime(0,0,0,10+3,20,2005)).’.
‘;
echo ‘Plus 13 zile: ‘.dataRomana(mktime(0,0,0,10+3,20+13,2005)).’.
‘;
echo ‘
‘;

echo date(‘d M y’, strtotime(‘7 October 2008′)).’
‘;
echo date(‘d M y’, strtotime(‘October 7 2008′)).’
‘;
echo date(‘d M y’, strtotime(„10/07/2008”)).’
‘;
echo date(‘d M y’, strtotime(„10-07-2008”)).’
‘;
echo date(‘d M y’, strtotime(„10.07.2008”)).’
‘;
echo ‘
‘;

echo ‘Azi: ‘.date(‘d F Y’,strtotime(„now”)).”
„;
echo ‘Acum zece zile: ‘.date(‘d F Y’,strtotime(„-10 day”)).’
‘;
echo ‘Peste trei zile: ‘.date(‘d F Y’,strtotime(„3 day”)).’
‘;
echo ‘Peste o saptamana: ‘.date(‘d F Y’,strtotime(„1 week”)).’
‘;
echo ‘Peste 2 sapt si 3 zile: ‘.date(‘d F Y’,strtotime(„2 week 3 days”)).’
‘;
echo ‘Lunea viitoare: ‘.date(‘d F Y’,strtotime(„next Monday”)).’
‘;
echo ‘Lunea trecuta: ‘.date(‘d F Y’,strtotime(„last Monday”)).’
‘;[/PHP]

Dar există o metodă mai apropiată de limbajul natural decât lucrarea cu timpul Unix. PHP pune la dispoziţie funcţia strtotime(), care, citez: „translează aproape orice descriere textuală în limba engleză a datei şi orei într-un timestamp Unix”. Atenţie însă mare. În primul rând să reţinem că se foloseşte limba engleză. La nevoie putem sări peste cuvinte pentru a exprima o dată exclusiv prin cifre şi delimitatoare, dar… observaţi linia 21. Ce credeţi că va afişa? 7 octombrie sau 10 iulie? Sistemul implicit nu este cel cu care suntem noi obişnuiţi, prima fiind luna şi apoi ziua din lună (amintiţi-vă şi la funcţia mktime() e aceeaşi inversiune). Deci linia 21 va afişa 07 Oct 08. Doar că liniile 22 şi 23 vor afişa… 10 Jul 08. Probabil acei delimitatori spun: „nu mergem pe sistemul american”. Nu aş putea să spun exact – cine ştie poate completa în comentarii – dar cert e că cea mai clară dată scrisă în engleză este cea cu numele lunilor.

Şi să mergem mai departe, la ultimul calup de linii din codul de mai sus. Vedem în acţiune puterea aceleiaşi funcţii. Ea nu acceptă doar date exacte ci şi exprimări relative. Astfel, pe lângă „now” care dă momentul actual, putem faţă de momentul actual să calculăm rapid data de acum 10 zile, de peste 3 zile, de acum o săptămână ş.a. Şi aici sunt unele aspecte cu cântec: unele versiuni de PHP încep ziua de la ora 0, altele de la ora 24. Apoi în caz de eroare funcţia returna -1 până la PHP 5.1, versiune de la care începând returnează false (de testat cu trei de egal, nu cu doi). Codul în acţiune îl puteţi vedea aici.

Încheiem cu o altă problemă concretă: ce vârstă aveţi? De data aceasta folosim un formular cu un singur câmp text, unde aşteptăm ca utilizatorul să introducă data în formatul zz-ll-aaaa (zi-lună-an). Dacă a introdus-o corect verificăm dacă e validă şi dacă data introdusă e anterioară zilei de astăzi.

[HTML]

Indicati va rog ziua Dvs de nastere sub forma zz-ll-aaaa, adica 23.03.2009.



Data valida! Imi pregatesc bila sa va ghicesc varsta.

‘;
$datan_unix=mktime(0,0,0,$datan_sir[1],$datan_sir[0],$datan_sir[2]);
if($datan_unix>$azi_unix)
echo ‘

Nu aveti voie sa folositi programul daca nu v-ati nascut inca.

‘;
else {
$estimare_zile=($azi_unix-$datan_unix)/(60*60*24);
$estimare_ani=floor($estimare_zile/365);
$estimare_luni=floor(($estimare_zile-$estimare_ani*365)/30);
echo „

S-ar putea spune ca aveti $estimare_ani ani si $estimare_luni luni.

„;
}
}
else
echo ‘

Data incorecta!

‘;
}
?>[/HTML]

În caz că data introdusă trece toate testele, rămâne doar puţină matematică. Desigur, facem nişte aproximări (ca şi cum toţi anii ar avea 365 de zile şi toate lunile 30 de zile), dar sunt acceptabile. Codul în acţiune îl puteţi vedea aici.

PS: Programul merge şi pentru vârste dinainte de începutul Erei Unix. Şi aici depinde de server şi de configuraţie. Oricum, nu încercaţi o vârstă din secolul XIX că nu va merge… Pentru astfel de situaţii abordarea e alta, (şi) mai matematică.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (3 evaluări, media: 5,00 din 5)
Loading...Loading...

0 comentarii


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *