datetime.fromisoformat 的文档示例引发无效的 isoformat 字符串错误

Documentation example for datetime.fromisoformat raises invalid isoformat string error

提问人:Marco Ocram 提问时间:3/28/2023 最后编辑:Dima ChubarovMarco Ocram 更新时间:3/29/2023 访问量:1111

问:

在 Python 3.10.8 中,如果我写

from datetime import datetime
print(datetime.fromisoformat('2011-11-04T00:05:23Z'))

我收到错误

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    print(datetime.fromisoformat('2011-11-04T00:05:23Z'))
ValueError: Invalid isoformat string: '2011-11-04T00:05:23Z'

这很令人惊讶,因为这个例子是直接从 datetime 模块文档中摘录的:

>>> from datetime import datetime
# ...
>>> datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)

这是文档中的错误还是错误?

python-3.x 日期时间 python-datetime

评论

0赞 Panagiotis Kanavos 3/28/2023
3.11 中没有重现
1赞 Matthias 3/28/2023
文档也说:“在 3.11 版中更改:以前,此方法仅支持可由 或 .” 发出的格式。这些函数能否在 Python 3.10.8 中提供带有尾随“Z”的日期字符串?date.isoformat()datetime.isoformat()
0赞 Marco Ocram 3/28/2023
非常感谢大家,很抱歉快速检查了文档。
0赞 FObersteiner 3/29/2023
另请参阅如何解析 ISO 8601 格式的日期?

答:

4赞 match 3/28/2023 #1

在 Python 3.11 之前,需要与 .fromisoformatisoformat

Python 不支持尾随作为 +00:00 的别名,因此出现错误。isoformatZ

来自 3.10 文档:

注意 - 这不支持解析任意 ISO 8601 字符串 - 它仅用作 datetime.isoformat() 的反向操作 https://docs.python.org/3.10/library/datetime.html#datetime.datetime.fromisoformat

来自 >=3.11 文档:

在 3.11 版更改: 以前,此方法仅支持 date.isoformat() 或 datetime.isoformat() 可以发出的格式: https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat

评论

1赞 Brian61354270 3/28/2023
“Python isoformat 不包含时区信息”似乎具有误导性。类似的东西是完全有效的。只是不支持用作别名。datetime.fromisoformat('2011-11-04T00:05:23.234+04:00')datetime(..., tzinfo=timezone.utc).isoformat()Z+00:00
0赞 match 3/29/2023
已经澄清了尾随 Z。
0赞 Brian61354270 3/28/2023 #2

示例

>>> from datetime import datetime
>>> datetime.fromisoformat('2011-11-04T00:05:23Z')
datetime.datetime(2011, 11, 4, 0, 5, 23, tzinfo=datetime.timezone.utc)

在文档中仅存在于 Python 3.11+ 中。它在 Python 3.10 中缺失。datetime

Python 3.11 的 BPO 35829 / BPO 46614 中引入了将尾随后缀解析为别名的功能。datetime.isoformatZ+00:00