如何将 Python 的. isoformat()字符串转换回 datetime 对象

因此,在 Python3中,您可以使用以下命令生成 ISO 8601日期。Isoformat () ,但是不能将 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 (空字符串,如果 object is naive). (empty), +0000, -0400, +1030

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

我知道在 Python 中 datetime 已经很糟糕了,但是这真的超出了不合理的范围,进入了愚蠢的领域。

Tell me this isn't true.

121324 次浏览

试试这个:

>>> 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)

Python 3.7 +

As of Python 3.7 there is a method datetime.fromisoformat() which is exactly the reverse for isoformat().

Older Python

如果你使用的是旧版的 Python,那么这就是当前解决这个问题的最佳“方案”:

pip install python-dateutil

然后..。

import datetime
import dateutil


def getDateTimeFromISO8601String(s):
d = dateutil.parser.parse(s)
return d