使用datetime解析三位数字年份

3

我在使用Python 3.x解析包含三位数年份的日期时间字符串时遇到了一个奇怪的问题。以下是一个示例:

from datetime import datetime

format = '%Y-%m-%dT%H:%M:%SZ'
dt = datetime.strptime('0699-02-02T15:11:43Z', format)
print(dt) # datetime.datetime(699, 2, 2, 15, 11, 43)
print(dt.strftime(format)) # '699-02-02T15:11:43Z'
print(datetime.strptime(dt.strftime(format), format))

我原本期望输出结果为datetime.datetime(699, 2, 2, 15, 11, 43),但是却出现了错误:
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/usr/local/lib/python3.8/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '699-02-02T15:11:43Z' does not match format '%Y-%m-%dT%H:%M:%SZ'

根据文档,使用%Y应该生成带有前导零的四位数年份,但这不是strftime的输出结果。此外,我得到的输出不能被解析回原始的datetime,正如上面的错误所示。
我可能错过了什么? 版本: 我正在使用python:3.8 Docker镜像运行,但我也尝试过python:3.6python:3.10

你正在运行哪个操作系统/Python版本?在我的电脑上(Win10/Py3.8)它可以正常工作。 - Pranav Hosangadi
我正在使用python:3.8 Docker镜像运行3.8.3版本。 - mhusaini
你确定吗?你的输出显示 /usr/lib/python3.6 - jonrsharpe
我已经尝试了两种方法,但是是的,我应该更新上面的输出以匹配版本。 - mhusaini
1
似乎是一个开放的Python错误(https://bugs.python.org/issue13305)。 - aaossa
1个回答

2

看起来这是Python上的一个已知问题(报告的bug)

我正在Windows上使用Python 3.10,输出结果与预期相符:

>> print(datetime.strptime(dt.strftime(format), format))
0699-02-02 15:11:43

一种可能的解决方案(hack):在您的字符串中添加缺失的前导零:

my_date = dt.strftime(format)
my_date = my_date.zfill(20)

1
感谢提供错误参考。也许在Python 3.10的Windows版本中已经修复了这个问题。但是python:3.10 Docker镜像仍然存在此错误。尚未直接在Ubuntu或类似系统上尝试3.10版本。 - mhusaini
1
感谢您提供的错误参考和解决方法。当年份超过5位数时,它确实会出现问题 (╯°□°)╯︵ ┻━┻ 但我也可以解决这个问题,只是不太优雅。 - Sam R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接