date()
Le funzioni di data e ora sono fondamentali in PHP. In questo articolo esploriamo le principali funzioni PHP per date e orari.
Introduzione
Quasi ogni applicazione deve prima o poi visualizzare, memorizzare o confrontare una data: una riga "pubblicato il", un conto alla rovescia, un controllo di scadenza. Questo capitolo spiega come funzionano gli strumenti PHP per data e ora e quando usare ciascuno. Iniziamo con le funzioni di uso quotidiano — date(), time() e strtotime() — poi passiamo alla manipolazione e al confronto delle date, e concludiamo con i punti che creano più confusione: i fusi orari e l'ora legale.
Lavorare con le Date in PHP
PHP offre due set di strumenti complementari per le date:
- Funzioni procedurali —
date(),time(),mktime()estrtotime()— che lavorano con un timestamp Unix (un semplice intero: il numero di secondi trascorsi dal 1° gennaio 1970 UTC). Sono veloci per la formattazione semplice e l'aritmetica di base. - L'API orientata agli oggetti
DateTime— le classiDateTime,DateIntervaleDateTimeZone— più leggibile per tutto ciò che riguarda intervalli, confronti o fusi orari, ed è l'approccio consigliato per il nuovo codice.
Questo capitolo utilizza entrambi gli stili in modo che tu possa riconoscerli nei progetti reali.
La Funzione date()
La funzione date() trasforma un timestamp in una stringa formattata. Accetta una stringa di formato come primo parametro e un timestamp opzionale come secondo; quando il timestamp è omesso, date() usa l'ora corrente.
Questo produce la data corrente nel formato "Mese Giorno, Anno", come March 3, 2023.
Ogni lettera nella stringa di formato è un segnaposto. La tabella seguente elenca i caratteri più utilizzati:
| Carattere | Significato | Esempio |
|---|---|---|
Y | Anno a 4 cifre | 2023 |
y | Anno a 2 cifre | 23 |
m | Mese, 2 cifre (01–12) | 03 |
n | Mese, senza zero iniziale | 3 |
F | Nome completo del mese | March |
M | Nome abbreviato del mese | Mar |
d | Giorno del mese, 2 cifre | 03 |
j | Giorno del mese, senza zero iniziale | 3 |
l | Nome completo del giorno della settimana | Friday |
H | Ora, formato 24 ore, 2 cifre | 14 |
h | Ora, formato 12 ore, 2 cifre | 02 |
i | Minuti, 2 cifre | 09 |
s | Secondi, 2 cifre | 05 |
A | AM / PM | PM |
Qualsiasi carattere non riconosciuto come segnaposto viene stampato letteralmente, quindi date("Y-m-d H:i:s") produce un valore come 2023-03-03 14:09:05. Per stampare una lettera letterale che altrimenti sarebbe un segnaposto, aggiungile una barra rovesciata: date('l \t\h\e jS'). Per l'elenco completo dei segnaposto, consulta il capitolo date-format().
La Funzione time()
La funzione time() restituisce il timestamp Unix corrente — il numero di secondi trascorsi dal 1° gennaio 1970 UTC. Non accetta argomenti ed è il punto di partenza abituale per l'aritmetica delle date, perché gli interi sono facili da sommare e confrontare.
Questo produce il timestamp Unix corrente, un intero lungo come 1646369616. Combinala con date() per formattare "adesso": date("Y-m-d", time()). Consulta il capitolo time() per maggiori dettagli.
La Funzione strtotime()
La funzione strtotime() analizza una data testuale in inglese — "March 3, 2023", "next Monday", "+2 weeks" — e restituisce il timestamp Unix corrispondente. È notevolmente flessibile, il che la rende comoda per convertire input umani in un timestamp da formattare o confrontare.
Questo produce il timestamp Unix per il 3 marzo 2023: 1677801600.
Attenzione: se
strtotime()non riesce ad analizzare la stringa, restituiscefalse, non un errore. Controlla sempre il risultato prima di usarlo —if (($ts = strtotime($input)) === false) { /* data non valida */ }— altrimentifalseviene silenziosamente convertito a0, che viene formattato come 1° gennaio 1970. Consulta il capitolo strtotime() per la grammatica completa che accetta.
Manipolazione delle Date in PHP
Oltre alla formattazione delle date, PHP offre una varietà di funzioni per manipolarle. Queste funzioni ti permettono di aggiungere o sottrarre tempo da una data, confrontare date e altro ancora.
Aggiungere e Sottrarre Tempo con strtotime()
strtotime() fa molto più che analizzare date fisse — comprende anche le espressioni relative. Passa un timestamp di base come secondo argomento e una frase come "+1 day", "-3 weeks" o "first day of next month" come primo, e otterrai un nuovo timestamp.
Questo produrrà la data di un giorno dopo il 3 marzo 2023, ovvero "March 4, 2023".
I Metodi DateTime::add() e DateTime::sub()
I metodi orientati agli oggetti DateTime::add() e DateTime::sub() aggiungono o sottraggono un DateInterval da un oggetto DateTime. Un DateInterval viene costruito da una stringa di durata ISO 8601: P1D significa "un periodo di 1 giorno", P2W è due settimane e PT1H30M è un'ora e trenta minuti (la T separa la parte della data da quella dell'ora).
Questo stile è preferito per il nuovo codice perché l'operazione si legge come una frase e l'oggetto tiene traccia del proprio fuso orario.
Questo produce la data di un giorno dopo il 3 marzo 2023: March 4, 2023. I capitoli dedicati date-add() e date-sub() approfondiscono l'argomento, mentre date-diff() mostra come ottenere l'intervallo tra due oggetti DateTime.
Confronto di Date in PHP
Poiché i timestamp sono semplici interi, puoi confrontare due date con i normali operatori <, > e == una volta che entrambi i valori sono timestamp. Converti prima ogni stringa di data con strtotime().
Questo produce Date 1 is earlier than Date 2. Per confrontare oggetti DateTime puoi usare gli stessi operatori direttamente ($a < $b) senza convertire in timestamp.
Fusi Orari e Ora Legale
La parte più delicata del lavoro con le date è assicurarsi che facciano riferimento allo stesso momento in diverse regioni. date() e time() interpretano i timestamp nel fuso orario predefinito configurato in PHP, quindi impostarlo correttamente è importante.
La Funzione date_default_timezone_set()
date_default_timezone_set() imposta il fuso orario predefinito utilizzato da tutte le funzioni di data e ora per il resto della richiesta. Chiamala una volta, all'inizio dello script, passando un identificatore IANA valido come America/New_York o Europe/London.
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s");
?>Un elenco di identificatori validi si trova nel capitolo php-timezones; la lettura dell'impostazione corrente è descritta in date-default-timezone-get().
La Classe DateTimeZone
Quando hai bisogno di fusi orari diversi nello stesso script — ad esempio, per mostrare l'ora di un evento a utenti di diverse regioni — impostare il fuso orario predefinito una sola volta non è sufficiente. La classe DateTimeZone permette a uno specifico oggetto DateTime di portare con sé il proprio fuso orario:
<?php
$timezone = new DateTimeZone("America/New_York");
$date = new DateTime("2023-03-03 09:00", $timezone);
echo $date->format("Y-m-d H:i T");
?>Questo formatta la data nell'ora di New York e stampa l'abbreviazione del fuso orario (T), ad esempio 2023-03-03 09:00 EST.
Lavorare con l'Ora Legale
L'ora legale (DST) sposta l'orologio in avanti o indietro, quindi l'offset per un fuso orario come America/New_York non è fisso (EST vs EDT). PHP gestisce il cambio automaticamente a patto che si utilizzi un nome di zona anziché un offset codificato a mano. Il carattere di formato I (i maiuscola) di date() indica se l'ora legale è attualmente in vigore: 1 se lo è, 0 se non lo è.
Questo indica se l'ora legale è in vigore o meno per il fuso orario predefinito corrente.
Conclusione
Ora hai il kit di strumenti essenziale per le date in PHP: date() per la formattazione, time() e strtotime() per ottenere e analizzare i timestamp, la famiglia DateTime per aggiungere, sottrarre e confrontare, e DateTimeZone per gestire regioni diverse. Come regola generale, usa le funzioni procedurali per una formattazione rapida e occasionale, e l'API orientata agli oggetti DateTime per tutto ciò che riguarda intervalli, confronti o più fusi orari. Per una panoramica più ampia consulta PHP Date and Time.