2014-05-12 7 views
6

Sto provando a generare dizionari che includono date che possono essere richieste per essere date in locali specifici. Per esempio, potrei voler mia funzione restituire questo quando viene chiamato con it_IT come argomento:Come posso ottenere la stringa del formato data corretta per una determinata locale senza impostare quella dimensione internazionale del programma in Python?

{'date': 'May 12, 2014', ...} 

E questo, quando viene chiamato con hu_HU:

{'date': '2014. május 12.', ...} 

Ora, sulla base di quello che ho trovato finora, dovrei utilizzare locale.setlocale() per impostare le impostazioni internazionali che desidero utilizzare e locale.nl_langinfo(locale.D_FMT) per ottenere il formato di data appropriato. Potrei chiamare lo locale.resetlocale() per tornare a quello usato in precedenza, ma il mio programma usa più thread, e presumo che anche gli altri saranno influenzati da questa modifica temporanea delle impostazioni locali.

risposta

5

V'è il modulo non standard babel che offre questo e molto di più:

>>> import babel.dates 
>>> babel.dates.format_datetime(locale='ru_RU') 
'12 мая 2014 г., 8:24:08' 
>>> babel.dates.format_datetime(locale='de_DE') 
'12.05.2014 08:24:14' 
>>> babel.dates.format_datetime(locale='en_GB') 
'12 May 2014 08:24:16' 
>>> from datetime import datetime, timedelta 
>>> babel.dates.format_datetime(datetime(2014, 4, 1), locale='en_GB') 
'1 Apr 2014 00:00:00' 
>>> babel.dates.format_timedelta(datetime.now() - datetime(2014, 4, 1), 
           locale='en_GB') 
'1 month' 
+0

Questo suona piuttosto fresco. Sai se è completamente sicuro? Se lo è, come lo realizza? – Underyx

+0

Non so se sia thread-safe, ma presumo che lo sia: se dovessi implementarlo, non userei nessuno stato globale ma ho tabelle di ricerca di sola lettura per le formattazioni locali, che ho usato ogni volta che ho avuto per formattare una data. –

+0

Infatti, apparentemente babele [scarica questo file] (https://github.com/mitsuhiko/babel/blob/master/scripts/download_import_cldr.py#L16) dopo l'installazione della libreria, quindi cerca i dati delle impostazioni locali in quello successivo (o per essere più specifici, in una mappatura generata dal file durante l'installazione). – Underyx

1

Potrebbe essere costoso farlo, ma che ne dici se prima di iniziare le discussioni si costruisce un dizionario di voci country code: datetime format?

for lang in lang_codes: 
    locale.setlocale(lang) 
    time_format[lang] = locale.nl_langinfo(locale.D_FMT) 
locale.resetlocale() 

è possibile utilizzare le stringhe di formato ogni volta che è necessario la data in un formato specifico time.strftime(time_format[lang], t). Naturalmente, questo non si prende cura dei turni GMT.

Il modo migliore sarebbe quello di trovare da dove viene la mappatura locale ma non lo so e non ho il tempo di indagare in questo momento.