strftime()
Scopri come strftime() di PHP formatta un timestamp con specificatori POSIX sensibili alla locale, perché è deprecata da PHP 8.1 e cosa usare al suo posto.
Introduzione
strftime() trasforma un timestamp Unix in una stringa leggibile di data/ora usando specificatori in stile POSIX (%Y, %B, %H, …) e, soprattutto, rispetta la locale attiva. Per questo era la funzione di riferimento ogni volta che servivano nomi di mesi o di giorni della settimana in una lingua diversa dall'inglese.
Questo capitolo mostra come funziona strftime(), elenca gli specificatori più utili e spiega perché nel nuovo codice conviene usare DateTime::format() o IntlDateFormatter. strftime() è stata deprecata in PHP 8.1 e rimossa in PHP 9.0, quindi conoscere sia il vecchio sia il nuovo approccio è importante quando si mantiene o si migra una codebase.
Sintassi
strftime(string $format, ?int $timestamp = null): string|false$format— una stringa composta da testo letterale e specificatori%(vedi la tabella più sotto).$timestamp— un timestamp Unix. Se viene omesso (o ènull), si usa l'ora corrente, quindi raramente serve passaretime()in modo esplicito.
Restituisce la stringa formattata, oppure false in caso di errore.
Differenze tra strftime() e date()
Entrambe le funzioni trasformano un timestamp in una stringa, ma rispondono a esigenze diverse:
date() | strftime() | |
|---|---|---|
| Stile degli specificatori | singole lettere (d, m, Y) | con prefisso % (%d, %m, %Y) |
| Nomi sensibili alla locale | no (sempre in inglese) | sì — segue setlocale(LC_TIME, …) |
| Stato | disponibile | deprecata in 8.1, rimossa in 9.0 |
Quindi, se ti serve solo un output in inglese, date() è più semplice. Il motivo storico per scegliere strftime() erano i nomi localizzati di mesi e giorni della settimana.
Un esempio di base
Qui date() formatta l'ora corrente come mese/giorno/anno, producendo un output come 03/03/2023. Questa è la base solo in inglese che strftime() estende con la localizzazione.
Usare strftime() per un output sensibile alla locale
%B è il nome completo del mese, %d il giorno con zero iniziale e %Y l'anno a quattro cifre, quindi l'output appare come March 03, 2023. La potenza di strftime() emerge quando si cambia la locale.
Cambiare la locale
Perché specificatori come %B (nome del mese) e %A (nome del giorno della settimana) restituiscano testo localizzato, imposta la locale LC_TIME prima di chiamare strftime() con setlocale():
<?php
setlocale(LC_TIME, 'fr_FR.UTF-8'); // French
echo strftime('%A %d %B %Y', mktime(0, 0, 0, 3, 3, 2023));
// → "vendredi 03 mars 2023"
?>La stringa esatta della locale (fr_FR.UTF-8, de_DE.UTF-8, …) deve essere installata sul server, altrimenti setlocale() restituisce false e l'output ricade sulla locale C/inglese.
Specificatori comuni
| Specificatore | Significato | Esempio |
|---|---|---|
%Y | Anno, 4 cifre | 2023 |
%y | Anno, 2 cifre | 23 |
%m | Mese, 2 cifre | 03 |
%B | Nome completo del mese (localizzato) | March |
%b | Nome abbreviato del mese | Mar |
%d | Giorno del mese, con zero iniziale | 03 |
%e | Giorno del mese, con spazio iniziale | 3 |
%A | Nome completo del giorno della settimana (localizzato) | Friday |
%a | Nome abbreviato del giorno della settimana | Fri |
%H | Ora, formato 24 ore, con zero iniziale | 09 |
%I | Ora, formato 12 ore, con zero iniziale | 09 |
%M | Minuti | 05 |
%S | Secondi | 07 |
%p | AM / PM | AM |
%j | Giorno dell'anno | 062 |
%% | Un segno di percentuale letterale | % |
La sostituzione moderna
Poiché strftime() non esiste più in PHP 9.0, il nuovo codice dovrebbe formattare con DateTime oppure, per una localizzazione completa, con IntlDateFormatter dell'estensione intl:
<?php
// English-only output: DateTime::format() with date()-style letters
$dt = new DateTime('2023-03-03');
echo $dt->format('F d, Y'); // March 03, 2023
// Localized output without a server-wide locale: IntlDateFormatter
$fmt = new IntlDateFormatter(
'fr_FR',
IntlDateFormatter::FULL,
IntlDateFormatter::NONE
);
echo "\n", $fmt->format($dt); // vendredi 3 mars 2023
?>IntlDateFormatter è la strada consigliata: si basa su ICU, non dipende dalle locali installate nel sistema operativo e non è interessata dalla deprecazione. Consulta DateTime::format() per l'insieme completo degli specificatori.
Cose a cui prestare attenzione
- Passa un timestamp, non un
DateTime.strftime()si aspetta un timestamp Unix intero; puoi crearne uno conmktime()ostrtotime(). - La locale deve essere installata. Una locale mancante ripiega silenziosamente sull'inglese: controlla il valore restituito da
setlocale(). - Usa
gmstrftime()se ti serve UTC invece del fuso orario locale. %enon è disponibile su Windows. Alcuni specificatori dipendono dalla piattaforma perchéstrftime()delega il lavoro alla libreria C.
Conclusione
strftime() formattava un timestamp in una stringa sensibile alla locale usando gli specificatori POSIX %, ed è per questo che storicamente veniva preferita a date() per i nomi di mesi e giorni della settimana non inglesi. Poiché è deprecata in PHP 8.1 e rimossa in 9.0, trattala come codice legacy: leggila con sicurezza nel codice esistente, ma scrivi il nuovo codice con DateTime::format() o IntlDateFormatter.