【问题标题】:`datetime.strftime` and `datetime.strptime` interprete %Y differently`datetime.strftime` 和 `datetime.strptime` 对 %Y 的解释不同
【发布时间】:2012-01-07 20:33:54
【问题描述】:

我使用如下所示的语句从字符串创建datetime 对象:

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:
    ...

我想知道是否有更好的方法来进行此验证。

【问题讨论】:

    标签: python datetime datetime-format


    【解决方案1】:

    我喜欢你使用 try..except 来验证输入的想法,因为在 Python 的某些未来版本中,可能可以接受

    代码中的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
    

    【讨论】:

    • 我还是不明白为什么这个限制不适用于strptime
    • datetime.strftime 最终调用了一些 C 函数,strftime. 使用的实现限制为年 >= 1900,或 1000,具体取决于 Python 的版本。 strptime 是在 Python 中实现的,没有相同的限制。看到这个feature request
    【解决方案2】:

    您可以简单地检查if t.year < 1900,如果它返回错误。无需刻意引发异常。

    【讨论】:

    • 感谢您的回复。顺便说一句,您知道为什么这些 to 方法的行为不同吗?
    猜你喜欢
    • 2019-07-12
    • 2016-04-27
    • 2019-06-06
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多