【问题标题】:Why does python's datetime.datetime.strptime('201412', '%Y%m%d') not raise a ValueError?为什么 python 的 datetime.datetime.strptime('201412', '%Y%m%d') 不会引发 ValueError?
【发布时间】:2016-09-16 13:29:58
【问题描述】:

在我给出的格式中,日期 2014-01-02 将由“20140102”表示。这是使用标准 strptime 正确解析的:

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

在这种格式中,“201412”不是有效的日期。 docs 表示“%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)

问题是:有没有办法指定“没有严重的零填充”?还是我在这种情况下误解了“零填充”一词?

请注意,问题不在于如何解析这种格式的日期,而在于理解 strptime 的行为。

【问题讨论】:

  • 这并没有真正帮助你,但它有点相关(想想/分隔字段)Parsing non-zero padded timestamp in python
  • 我认为这取决于函数使用的正则表达式
  • 看起来 Python 文档中的一些额外解释会很好。是否有保证,strptime("2014123", "%Y%m%d") 将始终提供datetime(2014, 12, 3, 0, 0) 或者可以是datetime(2014, 1, 23, 0, 0)
  • 请注意,文档没有%m 值必须用零填充,它只是说它表示“月份为十进制数”并提供了一个示例表明它可以补零。

标签: python datetime strptime


【解决方案1】:

根据 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。

【讨论】:

    【解决方案2】:

    如果您在此处查看如何为 %m https://github.com/python/cpython/blob/2d264235f6e066611b412f7c2e1603866e0f7f1b/Lib/_strptime.py#L204 定义正则表达式

    'm': r"(?P<m>1[0-2]|0[1-9]|[1-9])"

    您可以看到可以将 10-12、01-09 或 1-9 作为可接受的月份。

    【讨论】:

      【解决方案3】:

      这很棘手,但听起来strptime 只是试图尽可能地匹配字符串。 Python 的 strptime 与 C 的 strptime 相同,文档说填充是可选的:

      是月份数[1,12];前导零是允许的,但不是 必填。

      http://pubs.opengroup.org/onlinepubs/7908799/xsh/strptime.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-09
        • 1970-01-01
        • 2021-09-25
        • 1970-01-01
        • 2022-01-20
        • 2021-12-23
        • 2021-05-16
        • 1970-01-01
        相关资源
        最近更新 更多