Как конвертировать python.изоформат () строка обратно в объект datetime [дубликат]


этот вопрос уже есть ответ здесь:

  • Преобразование временных меток со смещением в объект datetime с помощью strptime 4 ответы
  • Как проанализировать дату в формате ISO 8601? 24 ответов

Так что в Python 3, Вы можете генерировать по стандарту ISO 8601 дата .isoformat (), но вы не можете преобразовать строку, созданную isoformat () обратно в объект datetime, потому что собственные директивы datetime pythons не соответствуют должным образом. т. е.: %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:Python34Lib_strptime.py", line 500, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:Python34Lib_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'

из документации Strptime Python: (https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)

%Z UTC смещение в виде +HHMM или -HHMM (пустая строка, если объект наивен). (пусто), +0000, -0400, +1030

короче говоря, Python даже не придерживается собственных директив форматирования строк.

Я знаю, что datetime уже ужасен в python, но это действительно выходит за рамки неразумного в землю простой глупости.

Скажи мне, что это неправда.

2 59

2 ответа:

как оказалось, это текущее лучшее "решение" этого вопроса:

pip install python-dateutil

затем...

import datetime
import dateutil.parser

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

попробуйте это:

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