Usare la funzione date() per manipolare le date con il formato convenzionale è più che sufficente. Quando si tratta, però, di gestire le date in un’altro linguaggio che non sia l’inglese (l’italiano per esempio), comincia a essere non del tutto funzionale.

Quando si vuole rappresentare una data in formato locate, PHP ci offre la funzione strftime(). Ma questo da solo non basta perché appunto ci serve che vengano caricate le informazioni della localizzazione al motore e si ottiene con la funzione setlocale() che acceta due parametri: la categoria dell’informazione (espressa con una costante riservata) e il linguaggio da adoperare per le informazioni.
Per il set di costanti e il set di lingue rimando alla pagina del manuale di PHP della funzione setlocale(). I segnaposto da usare nella funzione strftime() non sono uguali a quelli usati per la formattazione della stringa con date()
Vediamo un esempio. Configuriamo prima l’ambiente con la funzione setlocale()
Copia codice

<?php
setlocale(LC_TIME, 'ita', 'it_IT.utf8');
?>
Siccome per questo esempio ci serve solo modificare le informazioni relative alla data useremo la costante LC_TIME; se ci serve per tutto l’ambiente, come la divisa, la numerazione, messaggi di ritorno, ecc. useremo LC_ALL, anche se per ogni casistica esiste la sua costante specifica.
Il secondo parametro sarebbe una lista di possibili locale per il sistema operativo in uso. In questo caso ita si usa per i servers Windows, mentre un seguente parametro, 'it_IT.utf8' si usa per per i servers della famiglia *nix.
Configurata la lingua possiamo chiamiare la funzione strftime()
Copia codice

<?php
$mia_data = strftime("%A, %d %B %Y");
?>
Con la %A si ottiene il nome del giorno della settimana, la %d ritorna il giorno del mese nel formato gg, la %B ritorna il nome del mese e la %Y l’anno nel formato yyyy. Nella pagina del manuale ci sono tutti i segnaposto disponibili per formattare la data secondo le nostre essigenze.
Un ultimo appunto per quanto riguarda l’output della stringa. Si riferisce alla visualizzazione dei caratteri non standard, come le vocali accentate. Visto che la non funzione echo si occupa di visualizzare e non di trattare l’output, la stringa si dovrebbe filtrare con la funzione utf8_encode(), e così ci si assicura la sua corretta visualizzazione.
Copia codice

<?php
echo utf8_encode($mia_data);
# Visualizza: mercoledì, 19 aprile 2012
?>
La precedete soluzione (tre righe di codice) ci evita di creare array, liste e utilizzare degli indici se si usa la funzione date() come nell’esempio seguente.
Copia codice

<?php
$mesi = array('', 'gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio',  'agosto', 'settembre', 'ottobre', 'novembre','dicembre');
$giorni = array('domenica','lunedì','marted', 'mercoledì', 'giovedì', 'venerdì','sabato');
list($sett,$giorno,$mese,$anno) = explode('-',date('w-d-n-Y'));
echo $giorni[$sett],' ',$giorno,' ',$mesi[$mese],' ',$anno;
?>
Note
LC_NUMERIC e LC_ALL ci permette di convertire il separatore decimale ogni volta che lo si usa in una stringa, anche se la stringa è una query. Questo è un problema per ogni locale che utilizza la virgola come separatore decimale. Suggeriscono di essere sicuro che LC_NUMERIC sia impostato su un locale standard e utilizzare le funzioni di formattazione per visualizzare i numeri formattati solo quando è necessario.
Copia codice

<?php
setlocale(LC_ALL, 'ita', 'it_IT.utf8');
// sovrascrive il separatore  decimale
setlocale(LC_NUMERIC, 'en_US'); 
?>