[PILLOLE PHP] Come ottenere le date in italiano?
Quello che tratteremo in questo articolo è un problema piuttosto comune spesso sollevato dai principianti. Sebbene la sua soluzione sia piuttosto semplice dovremo comunque prestare attenzione ad alcuni aspetti.
La localizzazione delle date
Per ottenere da PHP le date in italiano dovremo innanzitutto fare uso della funzione setlocale() che imposta i parametri relativi ad una determinata lingua o area geografica e prende due argomenti:
- Il tipo di localizzazione. Nel nostro caso siamo interessati alle date, dunque passeremo la costante LC_TIME
- La stringa della lingua che intendiamo utilizzare, nel nostro caso it_IT.
Ma, come ormai dovresti sapere… c’è sempre un ma.
Nella precedente pillola PHP avevo anticipato che a volte succede che vi siano delle differenze a dipendenza del sistema operativo (diciamo pure che è sempre Windows a creare delle differenze). Ora, se il sistema operativo del server è Windows, la stringa che dovremo passare alla funzione setlocale() sarà ita_ITA e non it_IT.
Quindi prima di invocare la funzione setlocale() dovremo rilevare il sistema operativo ad esempio con la funzione proposta nel precedente articolo, oppure con una ulteriore semplificazione:
function isWin() { $sys = strtoupper(PHP_OS); if(substr($sys,0,3) == "WIN") { return TRUE; } return FALSE; } $localString = "it_IT"; if(isWin()) { $localString = "ita_ITA"; } setlocale(LC_TIME, $localString);
Come vedi ho creato la funzione isWin() che semplicemente ritorna TRUE se il sistema è Windows oppure FALSE se non lo è.
In seguito valorizzo la variabile $localString con “it_IT” per poi verificare se il sistema operativo è Windows, in quel caso passo il valore corretto alla variabile e solo a quel punto invoco la funzione setlocale().
Che funzioni utilizzare?
setlocale() fa capo alla funzione strftime() la quale, in base ai parametri passati, restituisce la data nel formato che desideriamo visualizzare.
Prende due argomenti:
- Il formato; così come descritto nella tabella della documentazione
- Opzionalmente il timestamp (se non viene passato nulla ritornerà la data e l’ora attuale)
Ora, se volessimo stampare la data attuale nel formato giorno_della_settimana – numero_del_giorno_del_mese – nome_del_mese possiamo procedere in questo modo (dopo aver localizzato le date):
echo strftime("%A %d %B");
Ed ecco che la stringa sarà correttamente formattata in italiano.
E la codifica?
Se non sei proprio afferrato nella codifica dei caratteri, è possibile che i nomi dei primi 5 giorni della settimana ti diano dei problemi. Per non complicare troppo le cose, visto che si tratta solo di una “ì”, risolviamo molto semplicemente così:
$data = strftime("%A %d %B"); echo str_replace('ì', 'ì', $data);
Conclusione
In questo articolo abbiamo visto come, grazie ad alcuni piccoli passaggi, possiamo visualizzare le date in italiano con PHP. Abbiamo inoltre visto un’applicazione pratica del rilevamento del sistema operativo.
Con questo articolo ricevi in regalo anche una piccola classe nella quale ho impacchettato tutto quello che abbiamo visto. Spero che ti torni utile.
18 commenti
Trackback e pingback
-
Tweets that mention [PILLOLE PHP] Come ottenere le date in italiano? | Your Inspiration Web -- Topsy.com
[...] This post was mentioned on Twitter by Gianni Leggio, PHP Italia and Antonino Scarfì, mtx_maurizio. mtx_maurizio said: RT @YIW…
Bravo Maurizio, ottimo articolo :)
Grazie Rocco!
Propio ieri cercavo come funzionasse il setlocale e sono stato ad impazzire per un quarto d’ora abbondante per capire che su windows bisogna mettere “ita_ITA”… Spero che questa guida eviti questo sbattimento a molte persone :)
Ottima pillola.
Grazie Michele. Peccato che non é stata pubblicata ieri :-)
Pillola davvero interessante, non ho mai pensato di mettere su un web server con Windows, ma, considerando che sto cominciando a sviluppare moduli che verranno venduti/distribuiti, conoscere queste differenze per me sta diventa fondamentale!
Bene, allora questa pillola ti sarà utile. Tuttavia non è obbligatorio pensare a tutto; nel senso che i tuoi codici li puoi rilasciare con delle specifiche tecniche.
Quando si rilascia qualcosa si fanno sempre delle scelte. Ad esempio: I miei script dovranno essere compatibili con l’ancora troppo diffuso php4? A mio parere no, e sono contento che una grande realtà come WP ha annunciato di non più supportare php4 a partire dai prossimi rilasci.
Ottimi consigli
Grazie
Di nulla :-)
Ciao Maurizio, ho scoperto questo sito da poco e sto raccogliendo tutti i vostri consigli sempre utilissimi. Grazie!
Riguardo a questo script, dovrebbe anche funzionare se si scrivesse direttamente:
if (setlocale(LC_TIME, “it_IT”) == NULL) setlocale(LC_TIME, “ita_ita”);
Hai visto però che da PHP 4.3.0 si possono immettere più parametri all’interno di setlocale() ? Vengono provati tutti i valori fino a quando non trova quello giusto.
Quindi si può ancora più facilmente scrivere così:
setlocale(LC_TIME, ‘it_IT’, ‘ita_ita’);
Spero di non aver detto cavolate, perchè sono alle prime armi con PHP…
Un saluto,
Matteo
Articolo interessante. Vorrei darvi uno spunto per un nuovo articolo sempre riguardo alle date php mysql.
In pratica riguarda la gestione delle date non esistenti. Esempio ho una select con i giorni, mesi, anni e devo gestire l’inserimento di una data non esistente (31/02/2010), mysql inserisce 0000-00-00.
Ciao Ilario.
Beh, non c’é molto da dire sull’argomento. Basta utilizzare la funzione checkdate()
http://ch2.php.net/manual/en/function.checkdate.php
:-)
il checkdate è lato server.
Mi riferivo ad un controllo lato client, prima di inviare il modulo.
Salve,
ho provato la funzione dell’articolo ma non riesce a prendermi ancora la data in italiano.
nel mio caso ho un db dove memorizzo 2 date.
uno è il campo data_nascita (date) memorizzato in questo modo 1920-01-01 e l’altro è un campo data_iscrizione (timestamp) 2010-03-01 20:51:35
Nel ciclo che legge i dati del db faccio cosi
while($riga=mysql_fetch_array($risultato))
{
$db_datan=$riga[“data_nascita”];
$db_data_iscr=$riga[“data_iscrizione”];
}
e poi voglio stampare le date in questo modo
e le voglio che escano come negli esempi sottostanti
giovedi 23 febbraio 2010
e la seconda
giovedi 23 febbraio 2010 10:38:42
però il giorno e il mese mi escono sempre in inglese anche se prima del ciclo di lettura ho utilizzato la funzione.
Grazie
Le funzioni presentate in questo articolo si riferiscono al timestamp UNIX. Le stringe prodotte da mysql vanno analizzate.
Ciao Maurizio
Una domanda, se l’host non ha la lingua italiana
il comando (setlocale(LC_TIME, “it_IT”) non funziona,
si può ovviare al problema?
E’ una cosa piuttosto strana.
Comunque bisognerà arrangiarsi creando degli array per i mesi e per i giorni della settimana.
ad esempio
$giorni = array(“domenica”,”lunedì”,martedì …..);
A questo punto, se volessi stampare il giorno corrente della settimana in italiano
echo $giorni[date(“w”)]
Hai capito il principio?
Grazie della risposta, sei stato molto gentile.