2011-11-28 35 views
6

我用一個聲明,如下圖所示,以創建一個字符串datetime對象:在我的代碼使用`datetime.strftime`和`datetime.strptime` interprete%Y不同

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

後來,某處的t對象並調用strftime方法具有相同的格式的字符串:

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

這導致ValueError: year=23 is before 1900; the datetime strftime() methods require year >= 1900

似乎在這兩種類似的方法中,%Y輸入的驗證是不同的。 所以我要做到以下幾點,以確保我不接受一些不好的幾年如23

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

我不知道是否有更好的方法來做到這一點的驗證。

回答

4

我喜歡你使用try..except來驗證輸入的想法,因爲在未來的某個版本的Python中,< 1000年可能是可以接受的。

This comment在代碼中暗示此限制僅限於Python當前的strftime實現。


在Python 2.7時,發生異常時爲years < 1900,但在Python 3.2 ,用於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) 

打印

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

我仍然不明白爲什麼這個限制不適用於'strptime'。 – satoru

+1

'datetime.strftime'最終會調用一些C函數'strftime.'。根據Python的版本,所使用的實現被限制爲年> = 1900或1000。 strptime是在Python中實現的,並沒有相同的限制。請參閱[功能請求](http://bugs.python.org/issue1777412)。 – unutbu

2

你可以簡單地檢查​​3210,如果它是返回一個錯誤。無需故意引起異常。

+0

Thx的答覆。順便說一句,你有什麼想法,爲什麼這些方法行爲不同? – satoru

相關問題