2011-11-28 5 views
6

używam oświadczenie, jak pokazano poniżej, aby utworzyć datetime obiektu z ciągiem:`datetime.strftime` i` datetime.strptime` Interprete% Y inaczej

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

Później, gdzieś w moich zastosowań kodowych przedmiotem t i wywołać metodę strftime z tego samego formatu ciąg:

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

powoduje to ValueError: year=23 is before 1900; the datetime strftime() methods require year >= 1900.

Wygląda na to, że walidacja wejścia% Y jest różna w tych dwóch podobnych metodach. Więc muszę wykonać następujące czynności, aby upewnić się, że nie akceptują złe lata jak 23:

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

Zastanawiam się, czy istnieje lepszy sposób to zrobić walidacji.

Odpowiedz

4

Podoba mi się twój pomysł użycia try..except do sprawdzenia poprawności danych wejściowych, ponieważ w niektórych przyszłych wersjach Pythona lata < 1000 mogą być akceptowane.

This comment w kodzie sugeruje, że ograniczenie to jest ograniczone do aktualnej implementacji strftime w Pythonie.


W Pythonie 2.7, wyjątek dla years < 1900, ale Pythona 3.2 wyjątek dla 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) 

drukuje

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

Nadal nie rozumiem, dlaczego to ograniczenie nie jest stosowane do 'strptime'. – satoru

+1

'datetime.strftime' ostatecznie wywołuje niektóre funkcje C,' strftime. Stosowana implementacja jest ograniczona do lat> = 1900 lub 1000 w zależności od wersji Pythona. strptime jest implementowany w Pythonie i nie ma takiego samego ograniczenia. Zobacz tę [prośbę o funkcję] (http://bugs.python.org/issue1777412). – unutbu

2

Można po prostu sprawdzić if t.year < 1900 i jeśli jest to zwróci błąd. Nie trzeba celowo powodować wyjątku.

+0

Thx na odpowiedź. Przy okazji, czy masz pojęcie, dlaczego te metody zachowują się inaczej? – satoru