Menu

PHP date(): ottenere, formattare e calcolare le date

date('Y-m-d') restituisce la data di oggi come stringa, e date('Y-m-d', $timestamp) formatta qualsiasi timestamp Unix. Impara time(), mktime(), strtotime(), DateTimeImmutable, come aggiungere giorni, la differenza tra due date e i fusi orari, con esempi eseguibili.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

date('Y-m-d') restituisce la data di oggi come stringa, per esempio 2026-03-14. Il primo argomento è una stringa di formato in cui ogni lettera rappresenta una parte della data (Y l'anno, m il mese, d il giorno, H:i:s l'ora), e un secondo argomento facoltativo è un timestamp Unix da formattare al posto del momento attuale.

L'output cambia ogni volta che premi Run, perché è la data e l'ora correnti in UTC. Ogni lettera della stringa di formato, e come inserire testo semplice tra di esse, è nella pagina sul formato delle date in PHP.

Timestamp: time(), mktime() e strtotime()

Un timestamp Unix è il numero di secondi trascorsi dal 1° gennaio 1970 a mezzanotte UTC. time() restituisce quello attuale, mktime(hour, minute, second, month, day, year) ne costruisce uno a partire dalle parti, e strtotime() legge una data scritta in inglese ('2026-03-14', '+1 week', 'next monday'). Passa qualsiasi timestamp come secondo argomento di date(). Il secondo argomento di strtotime() è il momento da cui conta una frase relativa; senza, conta da adesso.

Output:

1773480600
Sat, 14 Mar 2026 09:30
2027-01-01

tomorrow                    Sun 2026-03-15
+1 week                     Sat 2026-03-21
next monday                 Mon 2026-03-16
last day of this month      Tue 2026-03-31
first monday of next month  Mon 2026-04-06
bool(false)

Lo scorrimento di mktime() è utile: il giorno 0 di un mese è l'ultimo giorno del mese precedente, quindi mktime(0, 0, 0, 3, 0, 2026) è il 28 febbraio. Confronta sempre il risultato con false prima di passarlo oltre: date('Y-m-d', false) stampa in silenzio 1970-01-01, una data che nessuno intendeva.

Aggiungere giorni a una data

Per tutto ciò che va oltre la stampa, usa DateTimeImmutable. Il suo metodo modify() accetta le stesse frasi di strtotime() e restituisce una nuova data, e add() accetta un DateInterval come P7D (un periodo di 7 giorni) o PT90M (90 minuti).

Output:

2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28

Il 31 febbraio non esiste, quindi +1 month sul 31 gennaio arriva al 3 marzo. Quando intendi "la fine del mese prossimo", dillo con last day of next month.

DateTime vs DateTimeImmutable

DateTime modifica se stesso quando chiami modify(), add() o setDate(), e restituisce lo stesso oggetto. Questo sorprende chi tiene la data originale in una variabile:

Output:

2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21

Preferisci DateTimeImmutable nel codice nuovo. Le due classi hanno gli stessi metodi ed entrambe implementano DateTimeInterface, quindi una funzione può accettare l'una o l'altra.

Differenza tra due date

diff() restituisce un DateInterval. La sua proprietà days è il numero totale di giorni tra le due date, mentre y, m e d dividono lo scarto in anni, mesi e giorni, esattamente ciò che serve per calcolare un'età. Cambia le date ed eseguilo di nuovo:

Output:

Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days

In format(), %a è il totale dei giorni e %d è solo la parte dei giorni, quindi per "giorni mancanti" va usato %a. Per confrontare due date senza calcolare una differenza, gli operatori normali funzionano sugli oggetti data: $today < $christmas è true.

Fusi orari

date() e new DateTimeImmutable() usano il fuso orario di default, che viene da date.timezone in php.ini (UTC se non è impostato). Impostalo per l'intero script con date_default_timezone_set(), oppure dai a una singola data il suo DateTimeZone e converti con setTimezone():

Output:

Asia/Tokyo        2026-03-14 18:30 JST +09:00
Europe/Berlin     2026-03-14 10:30 CET +01:00
America/New_York  2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30

Un timestamp è lo stesso numero ovunque; il fuso orario cambia solo il modo in cui viene scritto. Ecco perché il consiglio abituale è salvare le date in UTC e convertirle quando le mostri.

Mostrare un calendario in una pagina web

Le date vengono stampate soprattutto nell'HTML. Questo blocco disegna il mese corrente come calendario ed evidenzia oggi. Eseguilo, poi clicca Previous o Next: lo stesso script viene eseguito di nuovo con $_GET['m'] preso dal link, come ?m=2026-04.

format('N') dà il giorno della settimana da 1 (lunedì) a 7 (domenica), cioè quante celle vuote vanno prima del giorno 1, e format('t') dà il numero di giorni del mese. Il ! in '!Y-m' azzera ogni campo che il formato non menziona, quindi il giorno è il 1° e l'ora è mezzanotte.

Errori comuni con date()

Il secondo argomento di date() deve essere un timestamp, non una stringa di data. Questa riga:

<?php
echo date('d/m/Y', '2026-03-14');

ferma lo script con un TypeError:

PHP Fatal error:  Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2

Converti prima la stringa, con strtotime() o con un oggetto:

Output:

14/03/2026
14/03/2026
bool(false)
bool(true)

Altri due da tenere d'occhio: m è il mese e i sono i minuti, quindi 'H:m' stampa il mese dove volevi i minuti; e new DateTimeImmutable('garbage') lancia un'eccezione invece di restituire false, quindi racchiudi l'input dell'utente in try/catch oppure analizzalo con DateTimeImmutable::createFromFormat(), che restituisce false se non corrisponde.

Domande frequenti

Come ottengo la data corrente in PHP?

Chiama date() con una stringa di formato: echo date('Y-m-d'); stampa la data di oggi come 2026-03-14, e date('Y-m-d H:i:s') aggiunge l'ora. La versione a oggetti è (new DateTimeImmutable())->format('Y-m-d').

Come aggiungo giorni a una data in PHP?

Usa modify() su un DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') dà 2026-03-21. Con i timestamp, date('Y-m-d', strtotime('+7 days', $timestamp)) fa lo stesso.

Come calcolo la differenza tra due date in PHP?

Chiama diff() su una data passando l'altra: $a->diff($b) restituisce un DateInterval. La sua proprietà days è il numero totale di giorni, e y, m, d contengono anni, mesi e giorni, ed è così che si calcola l'età di una persona.

Come converto un timestamp Unix in una data in PHP?

Passalo come secondo argomento di date(): date('Y-m-d H:i:s', 1773479107) restituisce 2026-03-14 09:05:07 in UTC. Per un oggetto, usa new DateTimeImmutable('@1773479107').

Perché date() di PHP mostra l'ora sbagliata?

date() usa il fuso orario di default, che viene da date.timezone in php.ini ed è spesso UTC. Imposta il tuo con date_default_timezone_set('Europe/Berlin') in cima allo script, oppure passa un DateTimeZone a DateTimeImmutable.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA