Operatii comune cu indicatori de timp 6
Limbajul PHP ofera solutii simple (dar puternice) pentru lucrul cu data si timpul. In versiunile mai noi (dupa 5.1) sunt introduse facilitati avansate cum ar fi DST (Daylight Saving Time), Timezones, Date Intervals, s.a. Inainte de acestea insa lucrul cu timpul se realiza folosind Unix timestamp.
Conceptul de Unix timestamp desemneaza numarul de secunde scurse de la 1 ianuarie 1970 (cand se considera ca a inceput era Unix).
Unix Timestamp-ul curent: 1728722363
Fiind vorba de un numar pozitiv ce are mereu aceeasi referinta, este usor sa se realizeze operatii cum ar fi scaderea, adunarea sau compararea a doua date reprezentate printr-un Unix timestamp.
Mai jos sunt cateva aplicatii menite sa evidentieze cat de usor se pot manipula date si ore in PHP.
Cum aflu o data din trecut sau viitor? 3
Sunt mai multe posibilitati. Se poate pleaca de la o data cunoscuta (pentru care avem Unix timestamp) si prin adunari/scaderi de secunde se afla data dorita (vezi aplicatia de mai jos). Sau se poate parsa o data folosind strtotime. Aceste solutii nu sunt intotdeauna aplicabile, iar in aceste cazuri se foloseste functia mktime.
Functia mktime primeste ca parametri anul, luna, ziua, ora pentru care se doreste aflarea detaliilor. Rezultatul este un timestamp ce poate fi formatat dupa cum se doreste.
Important: inainte de PHP 5.1.0, timestamp-urile negative nu erau suportate in unele sisteme (inclusiv Windows). De aceea domeniul valid al anilor era limitat intre 1970 si 2038.
tare asta
echo strftime("Ultima zi din Februarie 2000 este: %d", $ultima );
care este rolul lui $d ? ce insemna acesta?
Constructia "%d" din acel string reprezinta un indicator specific functiei "strftime" prin care se exprima modul de afisare a variabilei "$ultima".
%d inseamna "ziua lunii", deci din timestamp-ul $ultima se va extrage ziua si va fi afisata in locul lui "%d". Pentru detalii despre acesti indicatori de formatare a datei, vezi manualul PHP: http://ro1.php.net/strftime
Adauga un comentariu la aceasta sectiune.
Cum se formateaza data sau ora? 1
Formatarea datei sau a orei se poate realiza usor folosind functia date. Cu ajutorul acesteia se pot "extrage" doar acele parti din data care sunt necesare si se poate specifica formatul dorit. Spre exemplu, folosind functia date putem afisa data in format lung (de genul: "marti, 30 septembrie 2001") sau scurt (30.11.2001) sau cu aceeasi functie putem afisa ora sau oricare combinatie a celor doua.
Formatul se specifica print-un text format din caractere ce au o semnificatie anume, transmis ca parametru functiei date. Pentru detalii complete despre fiecare caracter in parte accesati http://www.php.net/manual/ro/function.date.php.
"; // afiseaza 11:39:23
echo date("Y-m-d") . "
"; // afiseaza 2024-10-12
echo date("F j, Y, g:i a") . "
"; // afiseaza October 12, 2024, 11:39 am
echo date("l") . "
"; // afiseaza Saturday
# se poate specifica un al doilea parametru ce reprezinta data/ora care se formateaza
echo date("d-m-Y H:i:s", $acum) . "
"; // afiseaza 12-10-2024 11:39:23
echo date("D, M d, Y", 1072915200) . "
"; // afiseaza Thu, Jan 01, 2004
# combinat cu mktime, se pot obtine informatii despre zile din trecut sau viitor
# de exemplu, ce zi a fost pe 4 iulie 2000
$iulie4 = mktime( 0, 0, 0, 7, 4, 2000 ); # aflu timestamp-ul
echo date( 'l', $iulie4 ); # formatez acel timestamp - extrag doar ziua
// afiseaza Tuesday
?>
E foarte folositor ceea ce faceti. Multumesc!
Adauga un comentariu la aceasta sectiune.
Cum determin ce zi si ora va fi peste 480 ore? 5
Pentru a efectua usor operatii cu zile si ore, se va folosi formatul de data Unix (UNIX timestamp), returnat de functia time(). Practic, data este afisata ca numarul de secunde scurs de la 1 ianuarie 1970, ora 00:00. Avand aceasta noua perspectiva (de a privi datele ca un numar de secunde), operatiile cu date (de genul 'cat va fi peste 2 zile', 'ce ora a fost acum xxx minute', etc) devin extrem de simple luand forma unor simple scaderi si adunari de secunde.
<?php
$acum= time();
$d= 100*365*24*3600;
echo "Peste 100 de ani va fi data de: " . date( "l, d.m.Y, H:i:s", $acum+$d);
?>
imi afiseaza Peste 100 de ani va fi data de: Tuesday, 06.12.1977, 14:01:42
unde gresesc de nu imi afiseaza data corecta?
Datorita unei limitari in PHP, functia date suporta repere de pana la 19 ianuarie 2038. Dupa aceasta data, timpul este masurat (in continuare) de la inceputul intervalului valid, ceea ce poate rezulta in date aparent fara nici o noima.
Am explicat mai detaliat aici: http://www.punctsivirgula.ro/289/data-in-viitor-cu-strtotime/
In principiu, trebuie sa ai grija ca datele tale sa nu depaseasca 2038 si totul va fi OK.
$acum= time();
$maitarziu=2*365*24*3600;
for($i=(date('y', $acum)), $i<=(date('y', $acum+$maitarziu)), $i++)
{if($i%4==0) {$a+=24*3600;
}
}
echo "Peste 2 de ani va fi: ", date('l, d-m-y h:i:s', $acum+$maitarziu)."<br>";
Incerc sa rezolv chestia cu anii bisecti, insa nu reusesc. Ma poate ajuta cineva?
$acum= time();
$maitarziu=2*365*24*3600;
for($i=(date('y', $acum)); $i<=(date('y', $acum+$maitarziu)); $i++)
{if(($i%4==0) && ($i%100!=100)) {$maitarziu+=24*3600;
}
}
echo "Peste 2 ani va fi data de: ", date('l, d-m-y h:i:s', $acum+$maitarziu)."<br>";
Gata, am rectificat. In principiu, eroarea era ca am pus "," in loc de ";" in cadrul for-ului. Multumesc oricum!
Da, intr-adevar, sintaxa folosita nu era corecta. Ma bucur ca s-a rezolvat.
Adauga un comentariu la aceasta sectiune.
Cum validez o data sau un timp? 7
Sunt mai multe modalitati de a valida datele si orele introduse de un utilizator, in functie de formatul acestora. Cel mai uzual insa se folosesc cele 2 functii de aflare a timestamp-ului: mktime si strtotime. Acestea returneaza anumite valori in cazul in care data verificata nu este valida.
Rezultatul exemplului cu strtotime() este gresit. Nu exista 29 februarie 2010
Daca pun data 35 februarie 2010 orikum imi da rezultat Valid ? nu inteleg dece si ku functia strtotime la fel ...
Exemplele astea doua sunt niste porcarii...poti pune si 80 februarie 2004 si tot la fel afiseaza "Data este valida"..luati si corectati...
Functia strtotime este "aditiva" in ceea ce priveste zilele, adica va "trece" in luna urmatoare.
Spre exemplu "31 february 2010" va fi considerat "3 march 2010". Practic diferenta de 3 zile, de la 28 cat are luna februarie (in 2010) a fost adaugata in luna urmatoare.
Intr-adevar, nu este o modalitate buna de validare in acest fel, voi actualiza exemplul pe site.
Exemplu cod cu strtotime:
$rezultat = strtotime( "31 february 2010" );
if( $rezultat === FALSE || $rezultat === -1 ) {
echo "Data nu exista";
} else {
echo "Data este valida: " . date( 'd.m.Y', $rezultat); // Data este valida: 03.03.2010
}
Functia strtotime se foloseste in principal pentru a valida date exprimate in limbaj natural, cum ar fi "2 hours ago", "in 3 weeks", "first Friday in December", etc. Datele exprimate absolut (zi, luna, an) se pot valida prin cealalta metoda.
<?php
$m=strtotime ("87 years ago");
date_default_timezone_set("Europe/Bucharest");
if ($m===false||$m===-1)
echo "Nu exista aceasta data";
else echo "Acum 87 de ani a fost data de: " . date ("l, d.m.Y, H:i:s", $m);
?>
Imi afiseaza Acum 87 de ani a fost data de: Saturday, 05.02.1927, 20:40:59
Cum fac folosind aceasta metoda sa verific ce data va fi peste 87 de ani?
Foloseste expresia "+x years" la apelul strtotime. De exemplu:
$m=strtotime("+10 years").
Trebuie sa tii cont, totusi, de o limitare a PHP-ului in reprezentarea timpului. Detalii la http://www.punctsivirgula.ro/289/data-in-viitor-cu-strtotime/
Adauga un comentariu la aceasta sectiune.
Cum afisez un mesaj de salut in functie de ora curenta (a serverului)? 0
= 7 && $h <= 11 ) print "Buna dimineata!";
elseif( $h > 11 && $h < 18 ) print "Buna ziua!";
elseif( $h >= 18 && $h < 22 ) print "Buna seara!";
elseif( $h >= 22 ) print "Noapte buna!";
else print "Ce? Esti treaz(a) la ora asta?";
// Buna dimineata!
?>
Cum afisez luna curenta si toate cele 12 luni in limba romana? 1
Nota: aceasta secventa de cod depinde de configurarile serverului pe care este executata. Limba romana trebuie instalata pe server pentru a avea rezultatele scontate.
Rezultatul (este posibil sa nu fie in limba romana!):
January February March April May June July August September October November December Luna curenta este: October
O varianta sigura ar fi urmatoarea:
$timp_setat=time(); //Timpul de la care dorim sa aflam ziua si luna in limba Romana
$ziua=array('Duminica','Luni','Marti','Miercuri','Joi','Vineri','Sambata')[date('w',$timp_setat)]; //Variabila care afiseaza ziua
$luna=array('','Ianuarie','Februarie','Martie','Aprilie','Mai','Iunie','Iulie','August','Septembrie','Octombrie','Noiembrie','Decembrie')[date('n',$timp_setat)];
//Variabila care afiseaza luna
echo'Ziua setata este '.$ziua.', iar luna setata este '.$luna;
Adauga un comentariu la aceasta sectiune.
ce data este pentru 1253137399?
@setlocale(LC_ALL, 'ro_RO.ISO8859-2', 'ro_RO.ISO-8859-2', 'ro', 'ro_RO', 'ro_RO', 'rom', 'romanian');
Nu prea merge cu @setlocale (sau poate nu stiu sa-l folosesc). Poate sa dea cineva mai multe detalii ?
$t = setlocale(LC_ALL, 'ro_RO.ISO8859-2', 'ro_RO.ISO-8859-2', 'ro', 'ro_RO', 'ro_RO', 'rom', 'romanian');
//echo "Pe acest sistem locala Ramina '$t'" . '<br>';
//echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978)) . "<br>";//vineri decembrie 1978
echo strftime("%A, %d %B %Y") . "\n";//sambata, 05 mai 2012
cum as putea face adunarea si scaderea a doua momentde timp?
Vezi exemplul de mai jos intitulat "Cum determin ce zi si ora va fi peste 480 ore?"
Adauga un comentariu la aceasta sectiune.