`datetime.strftime`和`datetime.strptime`对%Y的解释不同

6 投票
2 回答
11664 浏览
提问于 2025-04-17 07:13

我用下面的语句从一个字符串创建了一个 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:
    ...

我在想有没有更好的方法来进行这个验证。

2 个回答

2

你可以简单地检查一下 if t.year < 1900,如果是的话就返回一个错误。没必要故意去制造一个异常。

4

我喜欢你用 try..except 来验证输入的想法,因为在未来的某个Python版本中,年份小于1000可能会被接受。

这段代码中的评论表明,这个限制仅限于当前Python实现的strftime功能。


在Python 2.7中,年份小于1900时会出现异常,但在Python 3.2中,年份小于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

撰写回答