2016-09-16 108 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。

相关问题