2016-09-16 84 views
10

在我給出的格式中,2014-01-02的日期將由「20140102」表示。這是正確的解析與標準strptime:爲什麼python的datetime.datetime.strptime('201412','%Y%m%d')不會引發ValueError?

>>> datetime.datetime.strptime("20140102", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

在此格式下,「201412」將是一個有效的日期。 docs表示「%m」指令是「Month爲零填充十進制數」。它以「01,02,...,12」爲例。 days指令「%d」也應該是零填充的。

基於此,我預計「201412」將是這種格式的無效輸入,因此會引發ValueError。相反,它被解釋爲2014-01-02:

>>> datetime.datetime.strptime("201412", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

問題是:有沒有辦法指定「沒有嚴重零填充只」?或者我在這方面誤解了「零填充」這個詞?

請注意,這個問題不是關於如何解析這種格式的日期,而是關於理解strptime的行爲。

+0

這並不能真正幫助你,但它是有點關係(認爲'/'分開場)[解析在python非零填充時間戳(http://stackoverflow.com/問題/ 25279993 /解析非零填充時間戳在Python中) – metatoaster

+0

我認爲這取決於函數使用的正則表達式 – kiviak

+0

看起來像Python文檔中的一些額外的解釋會很好。是否有保證,'strptime(「2014123」,「%Y%m%d」)'總是會給'日期時間(2014年,12年,3年,0年)'或可能'日期時間(2014年, 23,0,0)'? – Matthias

回答

5

據對Python的跟蹤器相關issue,與例子是像這樣(有點變形對這個問題的,但是這一概念是完全相同的):

>>> datetime.datetime.strptime('20141110', '%Y%m%d').isoformat() 
'2014-11-10T00:00:00' 
>>> datetime.datetime.strptime('20141110', '%Y%m%d%H%M').isoformat() 
'2014-01-01T01:00:00' 

上面的行爲是確定爲而不是this comment所解釋的錯誤,其說明它們符合OpenGroup strptime standard,其指定「前導零被允許但不是必需的」。

我想解決的辦法是使用正則表達式或在傳入strptime之前檢查字符串長度是否爲8。

相關問題