W3docs

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:

php— editable, runs on the server

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:

CodiceSignificatoEsempio
dGiorno del mese, 2 cifre0131
jGiorno del mese, senza zero iniziale131
DNome del giorno, breveMonSun
lNome del giorno, completoMondaySunday
mMese, 2 cifre0112
nMese, senza zero iniziale112
MNome del mese, breveJanDec
FNome del mese, completoJanuaryDecember
YAnno, 4 cifre2025
yAnno, 2 cifre25
HOra, formato 24 ore, 2 cifre0023
hOra, formato 12 ore, 2 cifre0112
iMinuti, 2 cifre0059
sSecondi, 2 cifre0059
AAM / PMAM, PM
UUnix timestamp1750464000

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:

php— editable, runs on the server

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() e strtotime() lavorano con interi con segno a 32 bit e si bloccano al 2038-01-19 03:14:07 UTC. DateTime non è 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) e M (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() restituisce false, non 0, in caso di errore — e 0 è 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.

Esercitati

Pratica
In PHP, quale delle seguenti funzioni può essere usata per ottenere la data e l'ora correnti?
In PHP, quale delle seguenti funzioni può essere usata per ottenere la data e l'ora correnti?
Was this page helpful?