Date e tempo il modo OOP

L'estensione PHP Date / Time è un insieme di classi che ti consentono di lavorare con quasi tutte le attività relative a data e ora. È stato disponibile dal rilascio di PHP 5.2 e l'estensione ha introdotto diverse nuove classi, tutte mappate a scenari di vita reale:

  • Una data o un'ora è rappresentata da a Appuntamento oggetto.
  • Un fuso orario del mondo è rappresentato da a DateTimeZone oggetto.
  • DateInterval gli oggetti rappresentano un intervallo. Ad esempio, quando diciamo due giorni da ora in poi, i "due giorni" sono l'intervallo. Il DateInterval l'oggetto non si basa su una data o un'ora specifica.
  • DatePeriod gli oggetti rappresentano un periodo tra due date.

Ora non lasciare che gli ultimi due ti facciano una coda, vedremo l'uso del mondo reale di questi due in un momento.


A partire dal Data() a Appuntamento

Ogni volta che vogliamo mostrare una data che abbiamo usato Data(), è semplice e funziona Hai solo bisogno di passare il formato della data che ti serve. Ma è un vero dolore da manipolare, un buon esempio è la formattazione di date e ore in base a un fuso orario personalizzato.

DateTime fa molto di più che restituire una data formattata, ma prima di andare oltre, è necessario iniziarne una nuova Appuntamento oggetto che rappresenta la tua data e / o ora. Quindi possiamo fare ogni sorta di cose interessanti con esso. Una nuova istanza viene creata come qualsiasi altra classe PHP.

$ date = new DateTime ();

Il costruttore di DateTime accetta un parametro stringa che assume come valore predefinito "now", l'ora e la data correnti. Per creare un oggetto per una data specifica, devi passare la data e l'ora specifiche ad esso. La formattazione per il parametro è autoesplicativa nella maggior parte dei casi. Di seguito puoi trovare alcuni esempi diversi di costruzione del tuo Appuntamento oggetto:

nuovo DateTime ('2013, 24 marzo') // DateTime che rappresenta il 2013, 24 marzo new DateTime ('2013-03-24') // DateTime che rappresenta il 2013, 24 marzo new DateTime ('+ 2 days') // DateTime che rappresenta 2 giorni da ora in poi. nuovo DateTime ('domani')

Quando PHP sta avendo difficoltà a comprendere il formato, genererà un'eccezione. Un elenco completo della formattazione disponibile può essere trovato nella documentazione

Se non esiste una formattazione che corrisponda alle tue esigenze, puoi specificare il tuo formato utilizzando DateTime :: createFromFormat

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

Ora che abbiamo un oggetto DateTime in mano possiamo fare un sacco di cose, piuttosto facilmente.

Timestamp Unix

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

Modifica di data / ora

$ date-> setDate (2013, 12, 30); // yyyy, mm, dd imposterà la data specificata $ date-> setTime (12, 3, 20); // hh, mm, ss (opzionale) modificherà l'ora $ date-> modify ('tomorrow'); // manipolazione basata su stringa $ date-> setTimestamp (1364798550); // modifica usando un timestamp unix

Si noti che quando vengono impostati i valori fuori range, PHP modificherà la data di conseguenza. Per esempio, $ date-> setDate (2013, 12, 35); genererà 2014/01/04, lo stesso vale per il tempo.


Lavorare con più date

Ora che sei ossessionato da DateTime, la prossima cosa che sai, le tue app saranno riempite con oggetti DateTime. Inizierai ad amare date e orari come mai prima d'ora. D'ora in poi, avrai a che fare con oggetti DateTime, non con "stringhe" che devi passare a strtotime funzione quando hai bisogno di fare un po 'di matematica.

Supponiamo ad esempio di confrontare due compleanni:

$ sheldon = new DateTime ('May 20th, 1980'); $ neo = new DateTime ('11 marzo 1962'); se ($ sheldon> $ neo) echo 'Sheldon è più giovane di neo';

Un altro scenario potrebbe essere il confronto di due date. Possiamo confrontare le date l'una contro l'altra in questo modo:

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

Il diff la chiamata restituisce un oggetto DateInterval. Se scarichiamo il valore restituito:

DateInterval Object ([y] => 18 [m] => 2 [d] => 9 [h] => 0 [i] => 0 [s] => 0 [invert] => 0 [giorni] => 6645)

Queste sono proprietà pubbliche. È possibile generare un output amichevole da un oggetto DateInterval:

$ diff-> format ('Neo è più vecchio di% Y years e% m months older'); // Neo è più vecchio di 18 anni e 2 mesi

L'aspetto migliore dell'oggetto DateInterval è che è possibile applicare l'intervallo a un altro oggetto DateTime:

$ Neo-> aggiungere ($ diff); // compleanno di neo è cambiato in sheldon's

Nota: le modifiche a DateTime, come l'aggiunta non restituiscono nuovi oggetti DateTime, influiscono sull'oggetto originale. Ricorda sempre questo quando passi oggetti DateTime in tutta la tua app. PHP 5.5 ha introdotto una nuova classe che restituisce nuovi oggetti dopo la modifica.

diff non è l'unico posto in cui è possibile generare un oggetto DateInterval. Poiché si tratta di una classe, i nuovi oggetti possono essere avviati come al solito:

$ new_diff = new DateInterval ('P2Y');

La quantità di anni / mesi / giorni ecc., Viene passata come stringa al costruttore. Ulteriori informazioni possono essere trovate nella documentazione del costruttore.


Lavorare con i fusi orari

Quando si creano nuovi oggetti DateTime, il secondo argomento del costruttore definisce un fuso orario. Se saltiamo questo, verrà preso un fuso orario predefinito dal php.ini'S date.timezone. È possibile modificare questo in fase di esecuzione chiamando date_default_timezone_set:

date_default_timezone_set ( 'America / New_York'); nuovo DateTime ('oggi'); // L'oggetto datetime è sull'ora di New York

Puoi anche cambiare al volo i fusi orari. Come avrai intuito, per prima cosa abbiamo bisogno di un oggetto Timezone.

$ timezone = new DateTimeZone ('America / New_York'); $ Sheldon-> setTimezone ($ fuso orario); // compleanno di Sheldon ora a New York

Puoi definire il fuso orario durante la creazione del tuo nuovo oggetto DateTime:

$ sheldon = new DateTime ('May 20th, 1980', $ timezone);

Tuttavia, una cosa importante da notare è quella setTimezone modifica l'oggetto DateTime originale. In sostanza, ciò che chiediamo è "formatta questa data, in questo fuso orario" ogni volta che chiamiamo il setTimezone metodo. D'altra parte, nell'ultimo esempio in cui passiamo il fuso orario nel costruttore DateTime, stiamo dicendo, "la data che sto creando è in questo fuso orario".

Un elenco di fusi orari validi è disponibile nella documentazione online.


DatePeriods

Penso che il manuale ufficiale fornisca la migliore spiegazione:

Un periodo di data consente l'iterazione su un insieme di date e orari, ricorrenti a intervalli regolari, in un determinato periodo.

DatePeriod ci consente di generare un set di DateTimes utilizzando due giorni che definiamo tra un intervallo. Passiamo una data di inizio, un intervallo e una data di fine. Su ogni intervallo viene creato un nuovo oggetto DateTime.

Diciamo che vogliamo ottenere tutte le date di nascita di Sheldon, sin dalla sua nascita:

// poiché i compleanni si verificano ogni anno, l'intervallo è di un anno $ interval = new DateInterval ('P1Y'); // terzo argomento è la data di fine, new DateTime () == adesso $ period = new DatePeriod ($ sheldon, $ interval, new DateTime ()); foreach ($ period as $ dt) // Gli oggetti DateTime echo $ dt-> format ('Y-m-d - D'), "\ n"; 

Il risultato sarebbe:

1981-05-20 - Mer 1982-05-20 - Gio 1983-05-20 - Ven 1984-05-20 - Dom 1985-05-20 - Lun 1986-05-20 - Mar ... 

Ora, per impostazione predefinita, il DatePeriod include la data di inizio che passiamo. Tuttavia, il quarto argomento del costruttore ci consente di saltare la data di inizio:

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

Vediamo quante feste di compleanno Neo ha avuto prima della nascita di Sheldon:

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

Estensione

Tutte le classi che abbiamo trattato oggi possono essere estese per essere utilizzate con i tuoi metodi. Un uso popolare sta estendendo il DateTime con a __accordare metodo in modo da poter stampare correttamente un oggetto DateTime senza chiamare formato.


Scenari di utilizzo di coppia

  • Uno dei miei approcci personali all'utilizzo degli oggetti DateTime è quando si tratta di colonne data / ora nei database. Tutte le date sono memorizzate come date del fuso orario UTC. Il codice dell'app funziona solo con gli oggetti DateTime, ma prima che venga generata la query finale, tutte le date sono formattate in UTC. Questo approccio mi ha permesso di lavorare con più ingressi di fuso orario facilmente.

    Posso passare in un oggetto del tempo di New York e dimenticare completamente la formattazione, prima di andare al database. Posso passare facilmente tra i timestamp di Unix e la normale formattazione di data e ora nel mio database in qualsiasi momento, il mio codice app non si cura finché ottiene un oggetto DateTime.

  • Ho anche utilizzato DateInterval per semplificare la logica di pagamento dell'abbonamento. L'utilizzo degli oggetti DateInterval per definire l'intervallo tra l'abbonamento ha reso le cose davvero facili. Devo solo applicare l'intervallo per l'ultima data di pagamento.

Hai qualche buon esempio di utilizzo di data / ora? Condividili nei commenti.


Incartare

L'estensione data / ora ha così tanto da offrire, se sei sul filo del rasoio, ci sono nuove classi e interfacce introdotte da PHP 5.5. Assicurati di controllare il manuale. Grazie per aver letto.