W3docs

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 passare time() 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 specificatorisingole lettere (d, m, Y)con prefisso % (%d, %m, %Y)
Nomi sensibili alla localeno (sempre in inglese)sì — segue setlocale(LC_TIME, …)
Statodisponibiledeprecata 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

php— editable, runs on the server

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

php— editable, runs on the server

%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

SpecificatoreSignificatoEsempio
%YAnno, 4 cifre2023
%yAnno, 2 cifre23
%mMese, 2 cifre03
%BNome completo del mese (localizzato)March
%bNome abbreviato del meseMar
%dGiorno del mese, con zero iniziale03
%eGiorno del mese, con spazio iniziale 3
%ANome completo del giorno della settimana (localizzato)Friday
%aNome abbreviato del giorno della settimanaFri
%HOra, formato 24 ore, con zero iniziale09
%IOra, formato 12 ore, con zero iniziale09
%MMinuti05
%SSecondi07
%pAM / PMAM
%jGiorno dell'anno062
%%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 con mktime() o strtotime().
  • 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.
  • %e non è 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.

Pratica

Pratica
Cosa fa la funzione strftime() in PHP?
Cosa fa la funzione strftime() in PHP?
Was this page helpful?