Data e ora in PHP
Impara a lavorare con le date in PHP: formatta con date(), imposta il fuso orario, analizza stringhe con strtotime() e fai calcoli con DateTime.
Quasi ogni applicazione web deve gestire date e orari: timestamp sui post, date di scadenza, etichette "3 giorni fa", pianificazione, log. PHP offre due strumenti complementari: la famiglia di funzioni procedurale date() per la formattazione rapida, e la classe orientata agli oggetti DateTime per un'aritmetica delle date più sicura e potente.
Questo capitolo mostra come visualizzare la data corrente, controllare il fuso orario, convertire stringhe leggibili in timestamp e calcolare la differenza tra due date, insieme agli errori più comuni in cui ci si imbatte.
Come PHP rappresenta il tempo
Internamente, PHP memorizza un punto nel tempo come Unix timestamp: il numero di secondi trascorsi dalla mezzanotte UTC del 1° gennaio 1970. time() restituisce il timestamp corrente e la maggior parte delle funzioni per le date lo accetta come input:
<?php
echo time(); // e.g. 1750464000 (an integer)
echo date("Y-m-d"); // turns "now" into a readable string
?>Un timestamp è indipendente dal fuso orario — rappresenta lo stesso istante in tutto il mondo. Il fuso orario è rilevante solo quando si formatta quell'istante in una stringa leggibile, motivo per cui impostarlo correttamente è importante (vedi sotto).
Utilizzo di base di date()
La funzione date() converte un timestamp in una stringa formattata:
date(string $format, ?int $timestamp = null): string$formatè una stringa di caratteri di formato che descrive come deve apparire l'output.$timestampè opzionale. Se omesso,date()usa l'ora corrente.
Ecco la data corrente nel formato gg/mm/aaaa:
Qualsiasi carattere che non sia un codice di formato viene stampato letteralmente, quindi puoi mescolare separatori e testo:
<?php
echo date("l, F j, Y"); // e.g. Saturday, June 21, 2025
echo "\n";
echo date("Y-m-d H:i:s"); // e.g. 2025-06-21 14:30:05
?>Codici di formato
date() accetta decine di caratteri di formato. Questi sono quelli che userai più spesso:
| Codice | Significato | Esempio |
|---|---|---|
d | Giorno del mese, 2 cifre | 01 – 31 |
j | Giorno del mese, senza zero iniziale | 1 – 31 |
D | Nome del giorno, breve | Mon – Sun |
l | Nome del giorno, completo | Monday – Sunday |
m | Mese, 2 cifre | 01 – 12 |
n | Mese, senza zero iniziale | 1 – 12 |
M | Nome del mese, breve | Jan – Dec |
F | Nome del mese, completo | January – December |
Y | Anno, 4 cifre | 2025 |
y | Anno, 2 cifre | 25 |
H | Ora, formato 24 ore, 2 cifre | 00 – 23 |
h | Ora, formato 12 ore, 2 cifre | 01 – 12 |
i | Minuti, 2 cifre | 00 – 59 |
s | Secondi, 2 cifre | 00 – 59 |
A | AM / PM | AM, PM |
U | Unix timestamp | 1750464000 |
Per stampare una lettera che è un codice di formato (ad esempio una H letterale), eseguine l'escape con un backslash: date('\H:i').
Impostazione del fuso orario
date() formatta gli orari secondo il fuso orario predefinito del server. Fare affidamento sul default del server è una causa comune di bug "l'orario è sbagliato di qualche ora". Imposta il fuso orario esplicitamente all'inizio dello script (o in php.ini):
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s"); // formatted for New York time
?>Usa i nomi di fuso orario IANA come Europe/London, Asia/Tokyo o UTC. Per una panoramica di come PHP gestisce le regioni e l'ora legale, consulta il capitolo PHP Timezones.
Analisi di stringhe in timestamp
Quando una data arriva come testo — da un form, un'API o un database — strtotime() la converte in un timestamp che puoi formattare o usare per calcoli. Comprende sia date assolute che frasi relative in inglese:
strtotime() è tollerante ma ambigua. Una stringa come 01/02/2022 viene letta come mese/giorno (stile americano). Per un'analisi prevedibile di un formato noto, preferisci DateTime::createFromFormat() (vedi sotto). Quando strtotime() non riesce a interpretare l'input restituisce false, quindi verifica sempre il risultato. Consulta il capitolo dedicato a strtotime() per l'elenco completo delle frasi accettate.
La classe DateTime
Per qualsiasi cosa vada oltre la semplice visualizzazione, l'API orientata agli oggetti DateTime è l'approccio moderno e consigliato. Evita i limiti di overflow degli interi, gestisce i fusi orari in modo pulito e rende l'aritmetica delle date leggibile:
<?php
$date = new DateTime("2022-01-01 12:00:00");
// Format it
echo $date->format("l, F j, Y"); // Saturday, January 1, 2022
echo "\n";
// Add or subtract durations with DateInterval
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2022-01-11
?>DateTimeImmutable funziona allo stesso modo ma non modifica mai l'oggetto originale — modify() restituisce una nuova istanza. Preferiscila quando passi date in giro, in modo che un metodo chiamato altrove non possa modificare silenziosamente il tuo valore.
Calcolare la differenza tra due date
DateTime::diff() restituisce un DateInterval che descrive il divario tra due date, il che è molto più sicuro che sottrarre timestamp grezzi:
<?php
$start = new DateTime("2022-01-01");
$end = new DateTime("2022-03-15");
$diff = $start->diff($end);
echo $diff->days . " days total\n"; // 73 days total
echo $diff->format("%m months, %d days"); // 2 months, 14 days
?>Per l'equivalente in stile funzione, consulta il capitolo date_diff().
Errori comuni
- Il problema del 2038. Sui sistemi a 32 bit,
date()estrtotime()lavorano con interi con segno a 32 bit e si bloccano al2038-01-19 03:14:07 UTC.DateTimenon è interessata, quindi usala per date molto lontane nel futuro o nel passato. date()non èDate(). I nomi delle funzioni PHP non sono sensibili alle maiuscole, ma i codici di formato lo sono:m(mese) eM(nome del mese) sono diversi.- Avviso sul fuso orario mancante. Senza un fuso orario configurato, le versioni più vecchie di PHP emettono un avviso. Chiama
date_default_timezone_set()all'inizio. strtotime()restituiscefalse, non0, in caso di errore — e0è un timestamp valido (l'epoch Unix), quindi verifica con=== false.
Conclusione
PHP offre una gamma di strumenti per date e orari. Usa date() e time() per la formattazione rapida, strtotime() per analizzare le stringhe in arrivo, e le classi DateTime / DateTimeImmutable per l'aritmetica consapevole del fuso orario e il confronto tra date. Imposta il fuso orario esplicitamente, valida l'input analizzato e preferisci DateTime ogni volta che devi aggiungere, sottrarre o confrontare date.
Successivamente, esplora i componenti di base in dettaglio: la funzione date() di PHP, strtotime() e PHP Timezones.