为什么Python 3认为这个ISO8601日期:"2019-04-05T16:55:26Z"是无效的?

58
我将"2019-04-05T16:55:26Z"提供给Python 3的datetime.datetime.fromisoformat,却得到Invalid isoformat string的错误提示,尽管去掉Z后相同的字符串可以正常工作。ISO8601允许使用Z - https://en.wikipedia.org/wiki/ISO_8601
$ python3
Python 3.7.2 (default, Feb 12 2019, 08:15:36)

>>> datetime.fromisoformat("2019-04-05T16:55:26Z")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Invalid isoformat string: '2019-04-05T16:55:26Z'

>>> datetime.fromisoformat("2019-04-05T16:55:26")
datetime.datetime(2019, 4, 5, 16, 55, 26)

请注意djvg的评论:“从Python 3.11开始支持”。

1
可能是重复问题 https://dev59.com/0GIk5IYBdhLWcg3wBqGW - Nick Vitha
文档清楚地说明了支持的内容。 - jonrsharpe
39
是的,它们确实具有这个功能,但也许名称有误导性,因为它们并不使用真正的ISO格式工作! - stephendwolff
1
Python 3.11开始提供支持。 - undefined
5个回答

33

我刚刚查看了Python 3文档,它并不打算解析任意的ISO8601格式字符串:

注意:这不支持解析任意的ISO 8601字符串 - 它只是作为datetime.isoformat()的反向操作。


17
好的,那么应该使用哪个适当的函数来解析这个字符串呢? - Barney Szabolcs
6
@BarnabasSzabolcs,我的意思就是 - 我回复了上面的jonrsharpe说:“这个名称是误导性的,因为他们不使用实际的ISO格式”。 - stephendwolff

29

如果您已经知道您的API响应的格式,您可以使用:

from datetime import datetime
datetime.strptime("2022-04-07T08:53:42.06717+02:00", "%Y-%m-%dT%H:%M:%S.%f%z")

如果字符串中不包含毫秒等信息,根据你的需求进行调整。

否则,正如官方Python文档所建议的那样,使用dateutil包:https://dateutil.readthedocs.io/en/stable/parser.html#dateutil.parser.isoparse


1
哇,dateutil 对我来说是全新的。这为我节省了很多时间,谢谢! - Joe Sadoski
dateutil 是正确的方式来处理时间。 - Andres Canella

12

1
我遇到了同样的问题,并根据这个答案解决了它。
from dateutil import parser
yourdate = parser.parse(datestring)

它返回一个`datetime.datetime`,所以非常完美。

-15

这很简单。只需删除最后一个字母Z。

>>> from datetime import datetime; datetime.fromisoformat("2019-04-05T16:55:26")
datetime.datetime(2019, 4, 5, 16, 55, 26)

8
我认为你可能在某种程度上误解了重点。 - stephendwolff
你确定这在其他时区中是否正常工作? - SOFe

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