HOWTO · PHP
Converti la stringa in data e data-ora in PHP
Scopri come analizzare stringhe di data in PHP con `strtotime()` e `date()`, oppure con `DateTime::createFromFormat()` e `date_create_from_format()`.
In questa pagina
Una stringa che rappresenta una data resta testo finché PHP non la analizza. L’analisi interpreta quel testo come timestamp o come oggetto data-ora; la formattazione trasforma poi il valore analizzato nella rappresentazione richiesta dall’applicazione. Scegli strtotime() quando l’espressione della data è familiare e non ambigua. Se la stringa segue uno schema noto, preferisci un formato esplicito con DateTime::createFromFormat() o con la controparte procedurale, date_create_from_format().
Scegliere il metodo PHP più adatto per analizzare una data
Usa strtotime() per stringhe comuni, come una data in stile ISO, quando è accettabile un’interpretazione flessibile. Restituisce un timestamp Unix oppure false, mentre date() formatta un timestamp. Per un formato di input fisso, il metodo DateTime::createFromFormat() rende esplicito l’ordine previsto dei campi e restituisce un oggetto data-ora oppure false. La funzione procedurale date_create_from_format() offre lo stesso tipo di analisi senza chiamare direttamente il metodo statico.
Queste funzioni non eliminano l’ambiguità dell’input. Se gli utenti possono inserire date secondo convenzioni diverse, definisci il formato previsto nel punto in cui acquisisci il dato e convalidalo. In ogni caso, scegli consapevolmente il fuso orario da usare per interpretare una data-ora; altrimenti PHP utilizza il fuso orario predefinito configurato.
Analizzare stringhe di data flessibili con strtotime() e date()
Per una stringa data-ora familiare, analizzala con strtotime() e passa il timestamp restituito a date(). Prima di formattare, verifica che il risultato non sia false, così un’analisi non riuscita non viene usata come timestamp. L’esempio usa un input e un formato di output fissi, quindi il risultato è riproducibile indipendentemente dall’orologio corrente della macchina.
Esegui questo esempio. Il messaggio o il risultato testuale mostrato dal codice resta in inglese.
<?php
$dateString = '2023-10-15 14:30:00';
$timestamp = strtotime($dateString);
if ($timestamp === false) {
echo "Could not parse the date string.";
} else {
echo date('Y-m-d H:i:s', $timestamp);
}
strtotime() accetta molte espressioni testuali di data, ma questa flessibilità non sostituisce la dichiarazione di un formato di input. Il risultato rappresenta un istante interpretato secondo le regole del fuso orario; date() formatta il timestamp usando il fuso orario predefinito di PHP. Se la sorgente ha un fuso orario noto, includilo o applicalo esplicitamente invece di affidarti alle impostazioni del server.
Analizzare un formato noto con DateTime::createFromFormat()
Quando la stringa ha una struttura definita, specifica la stringa di formato corrispondente. Nel formato seguente, d, m, Y, H e i indicano rispettivamente giorno, mese, anno a quattro cifre, ora e minuti. Il ! iniziale azzera i campi non presenti nell’input, invece di ereditare i secondi della data corrente o altri valori.
Il messaggio o il risultato testuale mostrato dal codice resta in inglese.
<?php
$dateString = '15-10-2023 14:30';
$dateFormat = '!d-m-Y H:i';
$dateTime = DateTime::createFromFormat($dateFormat, $dateString);
if ($dateTime === false) {
echo "Could not parse the date string.";
} else {
echo $dateTime->format('Y-m-d H:i:s');
}
Il formato deve descrivere l’input, non l’output desiderato. Dopo l’analisi, chiama format() con il modello di output che vuoi ottenere. Un risultato diverso da false, da solo, non garantisce che ogni componente del calendario sia stata accettata esattamente come previsto: PHP può normalizzare alcuni valori fuori intervallo e segnalare avvisi. Per convalidare rigorosamente l’input, dopo l’analisi controlla DateTime::getLastErrors(), come descritto più avanti.
Usare la funzione procedurale date_create_from_format()
La funzione procedurale è utile nel codice che già usa le funzioni di data di PHP. Accetta la stessa stringa e lo stesso formato di input e, se l’analisi riesce, restituisce un oggetto DateTime; se fallisce, restituisce false. Usa date_format() per formattare l’oggetto restituito solo dopo aver verificato che sia un oggetto.
Il messaggio o il risultato testuale mostrato dal codice resta in inglese.
<?php
$dateString = '2023/10/15 14:30';
$dateFormat = '!Y/m/d H:i';
$dateTime = date_create_from_format($dateFormat, $dateString);
if ($dateTime === false) {
echo "Could not parse the date string.";
} else {
echo date_format($dateTime, 'Y-m-d H:i:s');
}
Questa è l’alternativa procedurale a DateTime::createFromFormat(): entrambe analizzano la stringa secondo il formato fornito e producono un oggetto DateTime. Scegli lo stile più adatto al codice circostante. Non è necessario fare affermazioni sulla versione di PHP per scegliere tra i due; per verificare la disponibilità dell’API, consulta la documentazione della versione di PHP supportata dalla tua applicazione.
Gestire input ambigui, errori di analisi e fusi orari
Una stringa come 03/04/2023 può indicare il 4 marzo oppure il 3 aprile, a seconda della convenzione. Non affidarti ai soli separatori per determinare l’intento. Se la sorgente segue una struttura nota, passa il formato esatto a DateTime::createFromFormat() e convalida il risultato. strtotime() è comodo per stringhe convenzionali e chiaramente definite, ma non può dedurre quale convenzione intendesse l’utente.
DateTime::createFromFormat() e date_create_from_format() possono restituire false; controlla il risultato prima di chiamare un metodo dell’oggetto o date_format(). Possono anche accettare un valore e al tempo stesso segnalare avvisi di analisi, per esempio quando PHP normalizza una componente della data. Se è importante che la data sia esattamente valida, controlla anche i dettagli diagnostici dell’analisi. Il messaggio o il risultato testuale mostrato dal codice resta in inglese.
<?php
$dateTime = DateTime::createFromFormat('!Y-m-d', '2023-02-31');
$errors = DateTime::getLastErrors();
if ($dateTime === false || ($errors !== false && ($errors['warning_count'] > 0 || $errors['error_count'] > 0))) {
echo "The date is not valid for the specified format.";
} else {
echo $dateTime->format('Y-m-d');
}
Il ! azzera i campi non specificati, mentre getLastErrors() segnala gli avvisi e gli errori dell’analisi più recente. I dettagli diagnostici possono variare tra le versioni di PHP: verifica la politica di convalida con le versioni supportate dalla tua applicazione. Per date-ora riferite a una regione specifica, crea un DateTimeZone per quella regione e passalo come terzo argomento a DateTime::createFromFormat() (oppure come argomento del fuso orario corrispondente nella funzione procedurale). Se l’input include un offset UTC esplicito, mantienilo o convertilo consapevolmente prima di formattare il valore da mostrare.