use*_*943 10 python datetime strptime
按照我给出的格式,日期2014-01-02将由"20140102"表示.这是使用标准strptime正确解析的:
>>> datetime.datetime.strptime("20140102", "%Y%m%d")
datetime.datetime(2014, 1, 2, 0, 0)
Run Code Online (Sandbox Code Playgroud)
在此格式中,"201412"将不是有效日期.该文档说,"%M"指令是"每月一零填充的十进制数." 它给出了例子"01,02,...,12".days指令"%d"也应该是零填充的.
基于此,我预计"201412"将是这种格式的无效输入,因此会引发ValueError.相反,它被解释为2014-01-02:
>>> datetime.datetime.strptime("201412", "%Y%m%d")
datetime.datetime(2014, 1, 2, 0, 0)
Run Code Online (Sandbox Code Playgroud)
问题是:有没有办法指定"没有严重的零填充"?或者我在这种背景下误解了"零填充"一词?
请注意,问题不是关于如何以这种格式解析日期,而是关于理解strptime的行为.
如果你看看如何为https://github.com/python/cpython/blob/2d264235f6e066611b412f7c2e1603866e0f7f1b/Lib/_strptime.py#L204定义正则表达式%m
'm': r"(?P<m>1[0-2]|0[1-9]|[1-9])"
您可以看到您可以将10-12,11-09或1-9视为可接受的月份.
根据Python跟踪器上的相关问题,示例就像这样(对这个问题进行了一些修改,但概念完全相同):
>>> 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'
Run Code Online (Sandbox Code Playgroud)
上述行为被确定为不是该注释所解释的错误,该注释表明它们符合OpenGroup strptime标准,该标准指定"允许但不需要前导零".
我想解决方法是使用正则表达式或在传入之前检查字符串的长度是否为长度为8 strptime.