2011-08-25 3 views
8

Sto scrivendo un test per un programma che verrà utilizzato in più locale. Durante l'esecuzione del test in tedesco, ho ottenuto l'errorePerché Python memorizza le stringhe di formato dell'ora tedesche e spagnole (e altre?) Come% T nel modulo locale?

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/_strptime.py", line 454, in _strptime_time 
    return _strptime(data_string, format)[0] 
    File "/usr/local/lib/python2.7/_strptime.py", line 317, in _strptime 
    (bad_directive, format)) 
ValueError: 'T' is a bad directive in format '%T' 

Scavando in questo, ho scoperto che l'uso di locale.nl_langinfo(locale.T_FMT) mentre in tedesco o spagnolo (e potenzialmente altre lingue) produce la stringa di formato '%T'. Questo non è riconosciuto nello time module.

La documentazione su locale allo python.org non menziona nulla sulla restituzione di '%T'. L'unico riferimento a '%T' che ho trovato dovunque è in una risposta a a separate StackOverflow question. Da quel post e dal contesto, suppongo che '%T' sia una scorciatoia per '%H:%M:%S'.

La mia domanda è, come faccio a gestire i locali per i quali locale tornerà '%T' per la sua stringa di formato senza fare qualcosa di simile a

if fmt_str == '%T': 
    fmt_str = '%H:%M:%S' 

per gestire questi casi?

+1

+1 Molto strano. Un modulo standard commette errori incondizionatamente, con un messaggio di errore assurdo, semplicemente a causa di una modifica della locale? – delnan

+0

Il problema sembra essere che i due moduli non comunicano tra loro e 'locale' ha iniziato a usare una scorciatoia che' time' non riconosce. Il che è molto strano, perché entrambi dovrebbero rispettare lo standard unix "date"; 'locale' fa mentre' time' apparentemente no. – Staunch

+0

Non è che il mio ambiente locale supporti '% T', è che' locale' usa '% T' come scorciatoia per'% H:% M:% S' ma 'tempo' no.Le abbreviazioni in 'locale' corrispondono ai formati della funzione' date' di Unix (per vederli, scrivi 'date --h' su una riga di comando), ma' time' usa un elenco ridotto di abbreviazioni. Per la cronaca, '% X' funzionerebbe, ma non è quello che viene restituito da' locale'. – Staunch

risposta

1

Questa è una risposta del tutto insoddisfacente, ma questa è la risposta in ogni caso:

Il motivo locale e time.strptime non funzionano bene insieme perché i formati locale non sono stati scritti per time.strptime. Sono stati scritti per time.strftime, per produrre i formati di data/ora necessari, non per analizzarli.

Poiché time.strptime è stato scritto per essere indipendente dalla piattaforma, non accetta il numero di direttive di locale; time.strftime deve essere in grado di convertire qualsiasi cosa generata, quindi accetta qualsiasi direttiva definita dalla piattaforma.

Quindi, no, non esiste un modo più semplice per rendere time e locale cooperare nel modo in cui desidero.

0

In realtà vedo che si sta usando strptime, non strftime. E la documentazione per strptime menziona:

Sono supportate solo le direttive specificate nella documentazione. Poiché strftime() è implementato per piattaforma, a volte può offrire più direttive di quelle elencate. Ma strptime() è indipendente da qualsiasi piattaforma e quindi non supporta necessariamente tutte le direttive disponibili che non sono documentate come supportate.

Come suggerito here, è possibile utilizzare una data più potente parser, come dateutil

>> import dateutil.parser 
>> dateutil.parser.parse("Thu Sep 25 10:36:28 2003") 
datetime.datetime(2003, 9, 25, 10, 36, 28) 
+0

Sfortunatamente, 'dateutil' non è un modulo standard, o almeno non è installato sui computer del mio posto di lavoro. :( – Staunch

+0

quindi, dal momento che strptime supporta solo gli specificatori di formato ansi, devi convertire tutti quelli non standard (che puoi). Puoi usare gli elenchi dalla documentazione di strftime sulla tua piattaforma, come: http: //linux.die. net/man/3/strftime (e usa un dict invece di 'if') –

+0

ma l'opzione migliore potrebbe essere quella di memorizzare tutte le date come unixtimestamps e convertire solo con strftime quando è necessario visualizzarle –

Problemi correlati