2011-11-28 15 views
6

Io uso una dichiarazione, come indicato di seguito per creare un oggetto datetime da una stringa:`` datetime.strftime` e datetime.strptime` interprete% Y diverso

t = datetime.strptime("0023-10-10", "%Y-%m-%d")

Più tardi, da qualche parte nel mio utilizza il codice l'oggetto e t richiamare il metodo strftime con la stessa stringa di formato:

t.strftime("%Y-%m-%d")

Questo provoca un ValueError: year=23 is before 1900; the datetime strftime() methods require year >= 1900.

Sembra che la convalida dell'input% Y sia diversa in questi due metodi simili. Quindi devo fare quanto segue per assicurarsi che io non accetto alcuni anni cattivi come 23:

try: 
    format = "%Y-%m-%d" 
    t = datetime.strptime("0023-10-10", format) 
    t.strftime(format) 
except ValueError: 
    ... 

Mi chiedo se c'è un modo migliore per fare questo la convalida.

risposta

4

Mi piace l'idea di utilizzare un try..except per convalidare l'input, poiché in alcune versioni future di Python, gli anni < 1000 potrebbero essere accettabili.

This comment nel codice suggerisce che questa restrizione è limitata all'attuale implementazione di Python di strftime.


In Python 2.7, l'eccezione si verifica per years < 1900, ma in Python 3.2, l'eccezione si verifica per years < 1000:

import datetime as dt 
format = "%Y-%m-%d" 
t = dt.datetime.strptime("0023-10-10", format) 
try: 
    t.strftime(format) 
except ValueError as err: 
    print(err) 

stampe

year=23 is before 1000; the datetime strftime() methods require year >= 1000 
+0

Ancora non capisco perché questa restrizione non sia applicata a 'strptime'. – satoru

+1

'datetime.strftime' alla fine chiama qualche funzione C,' strftime'. L'implementazione utilizzata è limitata a anni> = 1900, o 1000 a seconda della versione di Python. strptime è implementato in Python e non ha la stessa restrizione. Vedi questa [richiesta di funzionalità] (http://bugs.python.org/issue1777412). – unutbu

2

Si potrebbe semplicemente controllare if t.year < 1900 e se è restituito un errore. Non c'è bisogno di causare deliberatamente un'eccezione.

+0

Thx per la risposta. A proposito, hai qualche idea sul perché questi metodi si comportano diversamente? – satoru

Problemi correlati