2012-01-05 10 views
45

Ho un oggetto DateTime che attualmente sto formattazione tramiteoggetto Formattazione DateTime, rispettando Locale :: getDefault()

$mytime->format("D d.m.Y") 

Il che mi dà esattamente il formato ho bisogno:

Mar 5.3 .2012

L'unico punto mancante è la lingua corretta. Ho bisogno della traduzione tedesca di Tue (Tuesday), che è Die (Dienstag).

questo mi dà l'impostazione

Locale::getDefault() 

locale giusto Ma non so come dire DateTime::format di usarlo.

non c'è un modo per fare qualcosa di simile:

$mytime->format("D d.m.Y", \Locale::getDefault()); 
+0

attenzione: strftime ("% a% e.% L.% Y", \ Locale :: getDefault()) non funziona (almeno qui sul mio setup), poiché getDefault() restituisce "de" invece di "de_DE" ... – stoefln

+1

Il secondo parametro di strftime dovrebbe essere il timestamp, non un locale. – Jonathan

+0

Oh, mi dispiace. Completamente chiaro che questo non funziona. Quello che volevo davvero dire è che setlocale (LC_TIME, \ Locale :: getDefault()) non funziona (nella mia app symfony2) – stoefln

risposta

48

Questo perché format non prestare attenzione al locale. Dovresti usare invece strftime.

Ad esempio:

setlocale(LC_TIME, "de_DE"); //only necessary if the locale isn't already set 
$formatted_time = strftime("%a %e.%l.%Y", $mytime->getTimestamp()) 
+8

Questo comportamento è annotato nei documenti php su [DateTime :: format] (http: // www.php.net/manual/en/datetime.format.php): * 'Questo metodo non usa le impostazioni locali. Tutti gli output sono in inglese. * – rdlowrey

+20

strftime() non funziona con date precedenti al 1970, Date_time :: format() non funziona con locales ... c'è qualcosa che funzioni con entrambi? –

+1

@Jay K: È sempre possibile estendere la classe DateTime nativa di PHP per aggiungere localizzazione ad esso. – Duroth

81

È possibile utilizzare l'estensione Intl per formattare la data. Formatterà le date e le ore in base alle impostazioni locali prescelte, oppure puoi sostituirlo con IntlDateFormatter::setPattern().

Un esempio rapido di utilizzo di un motivo personalizzato, per il formato di output desiderato, potrebbe essere simile.

$dt = new DateTime; 

$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT); 
$formatter->setPattern('E d.M.yyyy'); 

echo $formatter->format($dt); 

Quali uscite quanto segue (per oggi, almeno).

Di. 4.6.2013


Edit: Ahh boo! Ho risposto a un'antica domanda perché alcuni commenti l'hanno trovata nell'elenco! Almeno l'opzione Intl è menzionata ora.

+0

è opportuno che tu abbia risposto a una domanda antica, perché questa domanda viene visualizzata nella parte superiore dei risultati di ricerca di Google e utilizzata per fornire solo informazioni obsolete. –

+0

Inoltre ottieni il badge "Necromancer" quando rispondi (con successo) a una vecchia domanda. – aesede

+0

E dovrebbe essere aggiornato come risposta corretta – Celoain

Problemi correlati