Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra

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: 
1550878224

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.

<?php
// data curenta
print date( 'd.m.Y H.i.s' ); // 23.02.2019 01.30.24 
 
// data in format Unix (UNIX timestamp)
print time(); // 1550878224 
 
// alegerea unui fus orar
date_default_timezone_set( 'Europe/Bucharest' );
 
// parsarea unei date
print strtotime("now");
print strtotime('1st January 2004'); //1072915200
?>
Mihai a spus cat inseamna 1253137399? - 17.09.2009

ce data este pentru 1253137399?

Oana Ionita a spus setare luni in romana - 13.02.2010

@setlocale(LC_ALL, 'ro_RO.ISO8859-2', 'ro_RO.ISO-8859-2', 'ro', 'ro_RO', 'ro_RO', 'rom', 'romanian');

Horea a spus luni si zile in limba romana date() - 19.04.2010

Nu prea merge cu @setlocale (sau poate nu stiu sa-l folosesc). Poate sa dea cineva mai multe detalii ?

Serge a spus setlocale - 05.05.2012

$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

prepelita Ion a spus intrebare - 16.04.2014

cum as putea face adunarea si scaderea a doua momentde timp?

Alexandru a spus Pentru Ion - 16.04.2014

Vezi exemplul de mai jos intitulat "Cum determin ce zi si ora va fi peste 480 ore?"


Adauga un comentariu la aceasta sectiune.

 


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.

<?php
# care este timestamp-ul pentru 31 januarie 2004, ora 13:00
echo mktime( 13, 0, 0, 1, 31, 2004); // afiseaza 1075546800 
 
# care este timestamp-ul pentru 3 septembrie 2014, ora 10:30
echo mktime( 10, 30, 0, 9, 3, 2014); // afiseaza 1409729400 
 
# ultima zi a unei luni poate fi exprimata ca ziua "0" a lunii urmatoare. 
$ultima = mktime(0, 0, 0, 3, 0, 2000);
echo strftime("Ultima zi din Februarie 2000 este: %d", $ultima );
// afiseaza Ultima zi din Februarie 2000 este: 29
 
# se pot folosi si valori negative
$zi = mktime(0, 0, 0, 3, -3, 2000);
echo strftime("Inainte de Martie 2000 cu 4 zile: %d", $zi );
// afiseaza Inainte de Martie 2000 cu 4 zile: 26
 
?>

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.

masini a spus tare asta - 07.05.2010

tare asta

Bogdan a spus ce insemna ? - 13.08.2014

echo strftime("Ultima zi din Februarie 2000 este: %d", $ultima );


care este rolul lui $d ? ce insemna acesta?

Alexandru a spus Pentru Bogdan - 14.08.2014

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.

<?php
# se preia data/ora curenta
$acum = time(); // $acum este o data in format Unix: 1550878224 
 
# formatarea se realizeaza cu functia date
# daca nu se specifica altfel, functia date va formata data/ora curenta
echo date("H:i:s") . "<br>"; // afiseaza 01:30:24 
echo date("Y-m-d") . "<br>"; // afiseaza 2019-02-23 
echo date("F j, Y, g:i a") . "<br>"; // afiseaza February 23, 2019, 1:30 am 
echo date("l") . "<br>"; // 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) . "<br>"; // afiseaza 23-02-2019 01:30:24 
echo date("D, M d, Y", 1072915200) . "<br>"; // 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
 
?>
Petre a spus Multumesc - 20.11.2012

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
// cerinta este: "cat va fi ora peste 480 de ore, adica peste (480 * 60 *60) secunde
 
$acum = time();
$maiTarziu = 480 /*ore*/ * 60 /*minute*/ * 60 /*secunde*/;
 
print "Data ceruta este: " . date( 'd.m.Y H.i.s', $acum + $maiTarziu );
// Data ceruta este: : 15.03.2019 01.30.24 
?>
Daniel a spus Nelamurire - 05.02.2014

<?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?

Alexandru a spus Pentru Daniel - 11.02.2014

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.

Geanin a spus Error - 16.12.2014

$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?

Geanin a spus Am rectificat - 17.12.2014

$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!

Alexandru a spus Pentru Geanin - 17.12.2014

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.

<?php
# mktime se foloseste cand avem date bine definite
# de exempleu, verificam daca a existat 29 februarie 2004
$rezultat = mktime( 0, 0, 0, 2, 29, 2004 );
if( $rezultat === FALSE || $rezultat === -1 ) { 
	# daca rezultatul nu este un timestamp inseamna ca data nu e valida
	echo "Data nu exista";
} else {
	echo "Data este valida: " . date( 'd.m.Y', $rezultat);
}
// Rezultat: Data este valida: 29.02.2004
 
 
# strtotime se foloseste cand avem date relative
$rezultat = strtotime( "2 days ago" );
if( $rezultat === FALSE || $rezultat === -1 ) { 
	echo "Data nu exista";
} else {
	echo "Data este valida: " . date( 'd.m.Y', $rezultat);
}
// Rezultat: Data este valida: 21.02.2019
 
?>
Piny a spus Invalid - 09.08.2010

Rezultatul exemplului cu strtotime() este gresit. Nu exista 29 februarie 2010

Serge a spus Greseala da !!! - 06.05.2012

Daca pun data 35 februarie 2010 orikum imi da rezultat Valid ? nu inteleg dece si ku functia strtotime la fel ...

Bogdan a spus Greseala - 09.06.2012

Exemplele astea doua sunt niste porcarii...poti pune si 80 februarie 2004 si tot la fel afiseaza "Data este valida"..luati si corectati...

Alexandru a spus Nu este greseala - 25.07.2012

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
}

Alexandru a spus strtotime - 06.12.2012

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.

Daniel a spus Intrebare - 05.02.2014

<?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?

Alexandru a spus Pentru Daniel - 11.02.2014

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 ! 

<?php
$t = localtime( time(), true ); // returneaza un vector cu elementele datei si orei locale
$h = $t[ 'tm_hour' ]; // iau doar ora
 
if( $h >= 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?";
 
// Ce? Esti treaz(a) la ora asta? 
?>

Nimic de afisat.


Adauga un comentariu la aceasta sectiune.

 


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.

<?php
setlocale( LC_TIME , 'ROM_ROM' );
 
// afiseaza numele celor 12 luni
for( $m = 1; $m <= 12; $m++ ) {
	print strftime( "%B", mktime( 0,0,0, $m, 1, 2008 ) ) . "\n";
}
 
// afiseaza luna curenta
print 'Luna curenta este: ' . strftime( "%B", time() );
?>
Rezultatul (este posibil sa nu fie in limba romana!):
January
February
March
April
May
June
July
August
September
October
November
December

Luna curenta este: February
Bordanc Nicu a spus Alta formatare - 01.02.2015

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.

 


Cum determin durata de executie a unui script PHP?    0 ! 

<?php
$time_start = microtime(true); # la inceputul codului PHP
 
/* ... codul PHP cu diverse operatii ... */
 
# la final se face diferenta si se afiseaza
$time_end = microtime(true);
 
print "Durata de executie (secunde): " . ( number_format($time_end - $time_start, 6) ); 
// Durata de executie (secunde): 0.002202 
?>

Nimic de afisat.


Adauga un comentariu la aceasta sectiune.