web-dev-qa-db-ja.com

Pythonの.isoformat()文字列をdatetimeオブジェクトに変換する方法

したがって、Python 3では、.isoformat()を使用してISO 8601日付を生成できますが、isoformat()によって作成された文字列を変換してdatetimeオブジェクトに戻すことはできません。Pythonのdatetimeディレクティブは適切に一致します。つまり、05:00(.isoformat()によって生成される)ではなく%z = 0500です。

例えば:

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

+ HHMMまたは-HHMMの形式の%z UTCオフセット(オブジェクトが単純な場合は空の文字列)。 (空)、+ 0000、-0400、+ 1030

要するに、Pythonは独自の文字列フォーマットディレクティブさえも遵守していません。

Pythonではdatetimeがすでにひどいことを知っていますが、これは本当に理不尽なことを超えて、単なる愚かさの地に行き着きます。

これは真実ではないことを教えてください。

70
Alex Urcioli

結局のところ、これがこの質問に対する現在の最良の「解決策」です。

pip install python-dateutil

その後...

import datetime
import dateutil.parser

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

これを試して:

>>> 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)
15
user 12321