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