Python 解析 strftime 输出时出现 strptime 错误

Python strptime errors on parsing strftime output

我正在尝试以人类可读的格式存储日期。为此,我保存并读回了一个包含日期的字符串。我使用 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'

但是,当我尝试使用 strftime 输出的 strptime 解析日期时,我只得到一个错误。似乎 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/

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, 1, 1, 0, 0)

Python Linux 上的 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, 1, 0, 0)
>>> assert d.date() == date.min

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

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