解析strftime输出时的Python strptime错误

问题描述

我正在尝试以人类可读的格式存储日期。为此,我保存并读回一个包含日期的字符串。我使用 date.min 来表示任何其他日期之前的日期。

from datetime import datetime,date

d = date.min
s = datetime.strftime(d,"%Y-%m-%d")
print(s) 
# 1-01-01

d2 = datetime.strptime(s,"%Y-%m-%d")
# ValueError: time data '1-01-01' does not match format '%Y-%m-%d'

但是,当我尝试使用 strptime 输出strftime 解析日期时,我只收到错误消息。似乎 strptime 期待像 0001 这样的前导零,而 strftime 没有输出

也许可以使用 None。有没有其他方法可以解决我认为是错误的问题?

解决方法

您需要添加前导零:

尝试更换:

s = {datetime.strftime(d,"%Y-%m-%d")}

与:

s = f'{d.year:04d}-{datetime.strftime(d,"%m-%d")}'

如果你想轻松处理日期,我真的可以推荐'Arrow'库。
https://pypi.org/project/arrow/

,

Linux 上的 Python 3.9 在对该问题的许多评论中如预期的那样显示了该问题。一种适用于所有平台的解决方法是对日期字符串使用 ISO 格式,并带有 date.isoformat():

>>> from datetime import date,datetime
>>> s = date.min.isoformat()
>>> s
'0001-01-01'
>>> d = datetime.strptime(s,"%Y-%m-%d")
>>> d
datetime.datetime(1,1,0)
>>> assert d.date() == date.min

您也可以使用 date.fromisoformat() 代替 strptime()

>>> date.fromisoformat(date.min.isoformat())
datetime.date(1,1)
,

strftime 不能向年份添加前导零。它调用底层 C 函数,它在年份前添加前导零的行为是 platform specific。您可以通过自己格式化日期对象来解决此问题。只需检查 d.year 是否小于 1000 并添加需要多少个前导零:

d = date.min
year_str = ''.join(['0' for _ in range(4 - len(str(d.year)))]) + str(d.year)
s = '{year}-{md}'.format(year=year_str,md=datetime.strftime(d,"%m-%d"))
d2 = datetime.strptime(s,"%Y-%m-%d")
# now d2 is equal to datetime.datetime(1,0)