107

因此,在 Python 3 中,您可以使用 .isoformat() 生成 ISO 8601 日期,但无法将 isoformat() 创建的字符串转换回 datetime 对象,因为 Python 自己的 datetime 指令不正确匹配。也就是说,%z = 0500 而不是 05:00(由 .isoformat() 生成)。

例如:

>>> strDate = d.isoformat()
>>> strDate
'2015-02-04T20:55:08.914461+00:00'

>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:\Python34\Lib\_strptime.py", line 337, in _strptime
    (data_string, format))
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

来自 Python 的 strptime 文档:(https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

%z UTC 偏移量,格式为 +HHMM 或 -HHMM(如果对象是幼稚的,则为空字符串)。(空),+0000,-0400,+1030

因此,简而言之,Python 甚至不遵守自己的字符串格式化指令。

我知道 datetime 在 Python 中已经很糟糕了,但这确实超出了不合理的范围,进入了愚蠢的境地。

告诉我这不是真的。

4

2 回答 2

101

Python 3.7+

从 Python 3.7 开始,有一种方法datetime.fromisoformat()isoformat().

较旧的 Python

如果您有较旧的 Python,那么这是该问题的当前最佳“解决方案”:

pip install python-dateutil

然后...

import datetime
import dateutil

def getDateTimeFromISO8601String(s):
    d = dateutil.parser.parse(s)
    return d
于 2015-02-05T00:19:13.767 回答
24

尝试这个:

>>> def gt(dt_str):
...     dt, _, us = dt_str.partition(".")
...     dt = datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S")
...     us = int(us.rstrip("Z"), 10)
...     return dt + datetime.timedelta(microseconds=us)

用法:

>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)
于 2015-02-04T21:49:55.957 回答