协慌网

登录 贡献 社区

如何解析 ISO 8601 格式的日期?

我需要将RFC 3339字符串(例如"2008-09-03T20:56:35.450686Z"解析为 Python 的datetime类型。

我在 Python 标准库中找到了strptime ,但这不是很方便。

做这个的最好方式是什么?

答案

python-dateutil包不仅可以解析 RFC 3339 日期时间字符串(例如问题中的字符串),还可以解析其他不符合 RFC 3339 的 ISO 8601日期和时间字符串(例如不具有 UTC 偏移量的字符串或代表仅一个日期)。

>>> import dateutil.parser
>>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686Z') # RFC 3339 format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686, tzinfo=tzutc())
>>> dateutil.parser.isoparse('2008-09-03T20:56:35.450686') # ISO 8601 extended format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)
>>> dateutil.parser.isoparse('20080903T205635.450686') # ISO 8601 basic format
datetime.datetime(2008, 9, 3, 20, 56, 35, 450686)
>>> dateutil.parser.isoparse('20080903') # ISO 8601 basic format, date only
datetime.datetime(2008, 9, 3, 0, 0)

请注意, dateutil.parser.isoparse可能比更dateutil.parser.parse更严格,但是它们两者都是相当宽容的,并且会尝试解释您传入的字符串。如果您想消除任何误读的可能性,您需要使用比这两个功能中的任何一个都严格的内容。

Pypi 名称是python-dateutil ,而不是dateutil (感谢code3monk3y ):

pip install python-dateutil

如果您使用的是 Python 3.7,请查看有关datetime.datetime.fromisoformat答案

Python 3.7 + 中的新功能


datetime标准库引入了一个用于反转datetime.isoformat()的函数。

classmethod datetime.fromisoformat(date_string)

返回datetime对应于date_string中的发射的格式之一date.isoformat()datetime.isoformat()

具体来说,此函数支持以下格式的字符串:

YYYY-MM-DD[*HH[:MM[:SS[.mmm[mmm]]]][+HH:MM[:SS[.ffffff]]]]

*可以匹配任何单个字符。

警告:这不支持解析任意 ISO 8601 字符串 - 仅用作datetime.isoformat()的逆运算。

使用示例:

from datetime import datetime

date = datetime.fromisoformat('2017-01-01T12:30:59.000000')

请注意,在 Python 2.6 + 和 Py3K 中,%f 字符捕获微秒。

>>> datetime.datetime.strptime("2008-09-03T20:56:35.450686Z", "%Y-%m-%dT%H:%M:%S.%fZ")

在这里查看问题