Quando utilizziamo le date in un ambiente PHP/MySQL, queste si trovano generalmente in due formati:
- Y-m-d H:i:s nel database (il formato DATETIME)
- d/m/Y in HTML, per la visualizzazione
Per cambiare il formato di una data, si passa generalmente attraverso una fase intermedia: il timestamp (l'ora Unix, o Posix time). Il timestamp rappresenta il numero di secondi trascorsi dal 1ยฐ gennaio 1970. Si utilizza la funzione strtotime per convertire una data in timestamp, poi la funzione date per convertire il timestamp nel formato desiderato.
<?php
$date = "2020-07-09 13:30:15";
echo date("d/m/Y", strtotime($date));
// Risultato: 09/07/2020
?>
Il problema con questo metodo รจ che siete limitati nel formato di partenza. In Europa, utilizziamo date nel formato d/m/Y (giorno/mese/anno), mentre la funzione strtotime si aspetta date nel formato americano m/d/Y (mese/giorno/anno).
- Se il separatore รจ un trattino (-), la data รจ considerata europea
- Se il separatore รจ una barra (/), la data รจ considerata americana
Riprendendo il nostro esempio, ma modificando semplicemente il separatore, non funziona piรน nulla:
<?php
$date = "09/07/2020 13:30:15";
echo date("d/m/Y", strtotime($date));
// Risultato: 07/09/2020 !!!
?>
[Attenzione] Dalla versione PHP 8.1
strftimeรจ obsoleta.DateTime::format()fornisce una sostituzione indipendente dalla localizzazione.IntlDateFormatter::format()fornisce una sostituzione sensibile alla localizzazione.
Esempio:
<?php
$date = "09/07/2020 13:30:15";
$dateTime = DateTime::createFromFormat("d/m/Y H:i:s", $date);
echo $dateTime->format("d/m/Y");
// Risultato: 09/07/2020
?>
La soluzione a questo problema si trova nella classe DateTime. Questa classe permette anch'essa di lavorare sulle date, con la differenza che potete specificare il formato della data di partenza. Le date non saranno piรน limitate al formato americano.
<?php
class DateUtils {
public static function formatDate($date, $inputFormat, $outputFormat) {
$dateTime = DateTime::createFromFormat($inputFormat, $date);
return $dateTime->format($outputFormat);
}
}
echo DateUtils::formatDate("09/07/2020 13:30:15", "d/m/Y H:i:s", "d/m/Y");
?>
Visualizzare la data odierna in italiano con PHP
Per visualizzare la data odierna in italiano con PHP, dovete:
- Definire le informazioni di localizzazione con la funzione
setlocale. - Definire il fuso orario predefinito con la funzione
date_default_timezone_set. - Utilizzare la funzione
strftimeper formattare la data con la configurazione locale. - Eventualmente utilizzare
utf8_encodeper gestire i problemi di accentuazione.
Nota: utf8_encode รจ necessario solo se non avete dichiarato la codifica da utilizzare nel vostro codice HTML:
<meta charset="utf-8">
Ecco il codice PHP per visualizzare una data in italiano:
<?php
setlocale(LC_TIME, "it_IT.utf8", "it_IT", "Italian_Italy");
date_default_timezone_set("Europe/Rome");
echo utf8_encode(strftime("%A %d %B %Y, %H:%M"));
// Risultato: giovedรฌ 09 luglio 2020, 13:31
?>
Nota: sostituite l'ultima riga con echo strftime('%A %d %B %Y, %H:%M'); se avete dichiarato la codifica nel vostro codice HTML.
Troverete maggiori informazioni riguardo strftime nella documentazione ufficiale PHP.
PHP 8.1: le funzioni strftime e gmstrftime sono obsolete
Le funzioni strftime e gmstrftime formattano un timestamp Unix basato sui parametri regionali correnti definiti con la funzione setlocale().
La funzione setlocale definisce i parametri regionali sul processo PHP, piuttosto che sul thread di lavoro corrente. Questo รจ problematico quando ci sono piรน thread di lavoro.
PHP propone delle API di formattazione dell'ora indipendenti e sensibili ai parametri regionali che sono migliori, piรน ricche e non soffrono di questo difetto. In particolare l'estensione intl e la classe IntlDateFormatter.
<?php
$formatter = new IntlDateFormatter("it_IT", IntlDateFormatter::FULL, IntlDateFormatter::SHORT);
echo $formatter->format(new DateTime());
// Risultato: giovedรฌ 9 luglio 2020, 13:31
?>
<?php
$formatter = new IntlDateFormatter(
"it_IT",
IntlDateFormatter::FULL,
IntlDateFormatter::NONE,
"Europe/Rome",
IntlDateFormatter::GREGORIAN,
"EEEE d MMMM yyyy"
);
echo $formatter->format(new DateTime());
?>
Soluzione
Per una formattazione di data/ora in PHP compatibile con i parametri regionali, utilizzate IntlDateFormatter::format (necessita dell'estensione intl):
In un caso d'uso reale e ideale, l'oggetto IntlDateFormatter viene istanziato una volta in base alle informazioni di localizzazione dell'utente (provenienti da una sessione, un campo del database utenti, ecc.).
<?php
$formatter = new IntlDateFormatter(
"it_IT",
IntlDateFormatter::LONG,
IntlDateFormatter::SHORT,
"Europe/Rome"
);
echo $formatter->format(new DateTime());
// Risultato: 9 luglio 2020, 13:31
?>
Per una formattazione di data/ora indipendente dai parametri regionali, utilizzate la funzione date() o DateTime::format / DateTimeImmutable::format:
<?php
echo date("d/m/Y H:i:s");
// oppure
echo (new DateTime())->format("d/m/Y H:i:s");
?>
DateTimeImmutable::format puรฒ anche formattare un oggetto DateTimeImmutable:
<?php
$date = new DateTimeImmutable("2020-07-09 13:30:15", new DateTimeZone("Europe/Rome"));
echo $date->format("d/m/Y H:i:s");
// Risultato: 09/07/2020 13:30:15
?>








0 Commenti