Datele și timpul - calea OOP

Extensia Date / Time PHP este un set de clase care vă permit să lucrați cu aproape toate sarcinile legate de dată și timp. Acesta a fost disponibil de la lansarea PHP 5.2, iar extensia a introdus mai multe clase noi, toate fiind cartografiate în scenarii reale:

  • O dată sau o dată este reprezentată de a DateTime obiect.
  • O fus orar al lumii este reprezentat de a DateTimeZone obiect.
  • DateInterval obiectele reprezintă un interval. De exemplu, atunci când spunem două zile de acum înainte, "două zile" este intervalul. DateInterval Obiectul nu se bazează pe o dată sau o anumită dată.
  • DatePeriod obiectele reprezintă o perioadă între două date.

Acum nu lăsați ultimele două să vă sfătuim, vom examina utilizarea în lumea reală a acestor două într-un moment.


Din Data() la DateTime

Ori de câte ori dorim să arătăm o dată pe care am folosit-o Data(), este simplu și funcționează. Trebuie doar să treci formatul de dată de care ai nevoie. Dar este o adevărată durere de manipulat, un exemplu bun este formatarea de date și de ore conform unei zone de fus orar personalizate.

DateTime face mai mult decât să întoarcă o dată formatată, dar înainte de a merge mai departe, trebuie să inițiezi o nouă DateTime obiect care reprezintă data și ora. Atunci putem face tot felul de lucruri interesante. O nouă instanță este creată la fel ca orice altă clasă PHP.

$ date = noua datăTime ();

Constructorul DateTime acceptă un parametru de șir care implică "acum", ora și data curentă. Pentru a crea un obiect pentru o anumită dată, trebuie să treceți data și ora specifice. Formatarea parametrului este explicativă în majoritatea cazurilor. Mai jos puteți găsi câteva exemple diferite de construire a dvs. DateTime obiect:

new DateTime ('2013, 24 martie') // DateTime reprezentând 2013, 24 martie new DateTime ('2013-03-24') // DateTime reprezentând 2013, 24 martie new DateTime ('+ 2 zile') // DateTime reprezentând 2 zile de acum înainte. new DateTime ("mâine")

Când PHP are dificultăți în înțelegerea formatului, va face o excepție. O listă completă a formatelor disponibile poate fi găsită în documentație

Dacă nu există formatare care să corespundă nevoilor dvs., puteți specifica propriul format utilizând DateTime :: createFromFormat

DateTime :: createFromFormat ('j-M-Y', '24-Mar-2013 ');

Acum că avem un obiect DateTime în mână, putem face o mulțime de lucruri, destul de ușor.

Timestamp Unix

$ Data-> getTimestamp (); // returnează un timestamp unix

Modificarea datei / timpului

$ date-> setDate (2013, 12, 30); // yyyy, mm, dd va seta data specificată $ date-> setTime (12, 3, 20); // hh, mm, ss (opțional) va modifica ora $ date-> modify ('mâine'); // manipulare bazată pe șir $ date-> setTimestamp (1364798550); // modificați utilizând un timestamp unix

Rețineți că atunci când sunt setate valori în afara domeniului, PHP va modifica data în consecință. De exemplu, $ date-> setDate (2013, 12, 35); va genera 2014-01-04, același lucru se întâmplă și pentru timp.


Lucrul cu date multiple

Acum că sunteți obsedat de DateTime, următorul lucru pe care îl știți, aplicațiile dvs. vor fi umplute cu obiecte DateTime. Vei începe să-ți iubești datele și orele ca niciodată. De acum încolo, veți avea de-a face cu obiecte DateTime, nu cu "șiruri" pe care trebuie să le treci la strtotime atunci când trebuie să faci puțină matematică.

Spuneți, de exemplu, că trebuie să comparați două zile de naștere:

$ sheldon = new DateTime ("20 mai 1980"); $ neo = new DateTime ("11 martie 1962"); dacă ($ sheldon> $ neo) echo 'Sheldon este mai mic decât neo';

Un alt scenariu ar putea fi compararea a două date. Putem compara datele împotriva celuilalt ca atare:

$ diff = $ neo-> diff ($ sheldon);

dif apelul returnează un obiect DateInterval. Dacă scădem valoarea returnată:

Obiectul DateInterval ([y] => 18 [m] => 2 [d] => 9 [h] => 0 [ 6645)

Acestea sunt proprietăți publice. Puteți genera o ieșire prietenoasă dintr-un obiect DateInterval:

$ diff-> format ('Neo este mai vechi de% Y ani și% m luni mai în vârstă'); // Neo este mai in varsta de 18 ani si 2 luni

Cel mai bun lucru despre obiectul DateInterval este că puteți aplica intervalul unui alt obiect DateTime:

$ Neo-> adaugă ($ dif); // ziua de naștere a lui neo sa schimbat la Sheldon

Notă: Modificările pentru DateTime, cum ar fi adăugarea nu returnează noi obiecte DateTime, afectează obiectul original. Țineți întotdeauna în minte acest lucru atunci când treceți obiecte DateTime în întreaga aplicație. PHP 5.5 a introdus o nouă clasă care returnează noi obiecte după modificare.

dif nu este singurul loc unde puteți genera un obiect DateInterval. Deoarece este o clasă, obiectele noi pot fi inițiate ca de obicei:

$ new_diff = nou DataInterval ("P2Y");

Valoarea anilor / lunilor / zilelor, etc., este transmisă ca un șir constructorului. Mai multe informații se găsesc în documentația constructorului.


Lucrul cu zonele temporale

Când creați noi obiecte DateTime, al doilea argument al constructorului definește o fus orar. Dacă ignorăm acest lucru, o zonă de fus orar implicită va fi preluată de la php.ini„s date.timezone. Puteți modifica acest lucru în timpul rulării apelând date_default_timezone_set:

date_default_timezone_set ( 'America / New_York'); new DateTime ("astăzi"); // datetime object este în New York

De asemenea, puteți schimba fusurile orare în zbor. După cum probabil ați ghicit, mai întâi avem nevoie de un obiect Timezone.

$ timezone = DataTimeZone nouă ("America / New_York"); $ Sheldon-> setTimezone ($ fus orar); // ziua de nastere a lui Sheldon acum in New York

Puteți defini fusul orar în timp ce creați noul dvs. obiect DateTime:

$ sheldon = new DateTime ("20 mai 1980", zona de timp $);

Cu toate acestea, este important să observăm acest lucru setTimezone modifică obiectul DateTime original. Ceea ce solicităm în principiu este "să formăm această dată, în această fus orar" ori de câte ori sunăm setTimezone metodă. Acum, pe de altă parte, în ultimul exemplu în care trecem fusul orar în constructorul DateTime, spunem: "data pe care o creez este în această fus orar".

O listă de fusuri orare valide este disponibilă în documentația online.


DatePeriods

Cred că manualul oficial oferă cea mai bună explicație:

O perioadă de date permite repetarea unui set de date și ore, care se repetă la intervale regulate, într-o anumită perioadă.

DatePeriod ne permite să generăm un set de DateTimes folosind două zile pe care le definim între un interval. Transmitem o dată de începere, un interval și o dată de încheiere. În fiecare interval este creat un nou obiect DateTime.

Să spunem că vrem să obținem toate datele de naștere ale lui Sheldon, de la nașterea lui:

// din zilele de nastere apar in fiecare an, intervalul este de un an $ interval = new DateInterval ('P1Y'); // al treilea argument este data de încheiere, new DateTime () == chiar acum $ period = new DatePeriod ($ sheldon, $ interval, new DateTime ()); foreach ($ perioadă ca $ dt) // DateTime obiecte echo $ dt-> format ('Y-m-d - D'), "\ n"; 

Rezultatul ar fi:

1981-05-20 - Mie 1982-05-20 - Jo 1983-05-20 - Vin 1984-05-20 - Soare 1985-05-20 - Luni 1986-05-20 - Tue ... 

Acum, în mod implicit, DatePeriod include data de începere la care trecem. Cu toate acestea, al patrulea argument către constructor ne permite să ignorăm data de începere:

$ period = new DatePeriod ($ sheldon, interval $, new DateTime (), DatePeriod :: EXCLUDE_START_DATE);

Să vedem cât de multe petreceri de naștere pe care Neo le-a avut înainte de a se naște Sheldon:

$ bdays = date noiPeriod ($ neo, $ interval, $ sheldon, DatePeriod :: EXCLUDE_START_DATE); echo iterator_count ($ bdays);

Extinderea

Toate clasele pe care le-am acoperit astăzi pot fi extinse pentru a fi utilizate cu propriile metode. O utilizare populară este extinderea DateTime cu a __toString astfel încât să puteți tipări corect un obiect DateTime fără a apela format.


Scenarii de utilizare a cuplurilor

  • Una dintre abordările mele personale privind utilizarea obiectelor DateTime este atunci când se ocupă cu coloanele date / timp din bazele de date. Toate datele sunt stocate ca date de fus orar UTC. Codul aplicației funcționează numai cu obiecte DateTime, dar înainte de generarea interogării finale, toate datele sunt formatate în UTC. Această abordare mi-a permis să lucrez cu mai multe intrări de fus orar cu ușurință.

    Pot să trec într-un obiect de timp din New York și să uit complet de formatarea lui, înainte de a merge la baza de date. Pot trece ușor între timestamps-urile Unix și formatul obișnuit de date-dată în baza mea de date oricând, codul meu de aplicație nu-i pasă atâta timp cât primește un obiect DateTime.

  • De asemenea, am folosit DateInterval pentru a simplifica logica de plată a abonamentului. Utilizarea obiectelor DateInterval pentru a defini timpul dintre abonament a făcut lucrurile cu adevărat ușor. Trebuie doar să aplic intervalul până la ultima dată de plată.

Aveți exemple bune de utilizare a datei / timpului? Împărtășește-i în comentarii.


Învelire

Extensia datei de timp are atat de mult de oferit, daca sunteti pe marginea sangerarii, exista noi clase si interfete introduse de la PHP 5.5. Asigurați-vă că ați terminat manualul. Vă mulțumim pentru lectură.

Cod