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

Ale*_*oli 75 python datetime iso8601 rfc3339

因此在Python 3中,您可以使用.isoformat()生成ISO 8601日期,但是您无法将isoformat()创建的字符串转换回datetime对象,因为Python自己的日期时间指令不能正确匹配.也就是说,%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'
Run Code Online (Sandbox Code Playgroud)

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

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

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

我知道日期时间在Python中已经很糟糕了,但这真的超出了不合理的范围,变成了愚蠢的土地.

告诉我这不是真的.

Ale*_*oli 60

事实证明,这是目前这个问题的最佳"解决方案":

pip install python-dateutil
Run Code Online (Sandbox Code Playgroud)

然后...

import datetime
import dateutil.parser

def getDateTimeFromISO8601String(s):
    d = dateutil.parser.parse(s)
    return d
Run Code Online (Sandbox Code Playgroud)

  • 悲伤的Python日期时间...... (110认同)
  • 在 python 3.7 中,有一个方法 [`datetime.fromisoformat()`](https://docs.python.org/3.8/library/datetime.html#datetime.date.fromisoformat) 与 `isoformat( )` (15认同)
  • @raratiru我指的是你需要一个外部模块来解析ISO格式的时间戳,但你可以用标准库生成一个.不一致让我难过. (5认同)
  • 值得注意的是,如果你的系统时间设置为UTC,那么解析日期的时区将是`tzlocal()`,比较中的`!= tzutc`,根据以下链接:https://coderwall.com/p/ dpauza/dateutil-解析-时区 (2认同)

use*_*321 16

试试这个:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

用法:

>>> gt("2008-08-12T12:20:30.656234Z")
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234)
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案没有解决所列出的问题(并且几乎是已经链接的可能重复的重复).在最初的问题中,OP已经要求一种有效的方法来解析UTC偏移量,其中包含冒号. (6认同)