1. ホーム
  2. python

[解決済み] Pythonの.isoformat()の文字列をdatetimeオブジェクトに戻す方法 [重複] (英語)

2022-12-05 18:39:44

質問

Python 3では、.isoformat()でISO 8601の日付を生成することができますが、isoformat()で生成した文字列をdatetimeオブジェクトに戻すことはできません。Python自身のdatetimeディレクティブが適切にマッチしないからです。つまり、(.isoformat()によって生成される)05:00ではなく、%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 )

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

つまり、Pythonは自分自身の文字列書式指定ディレクティブにすら従わないということです。

Pythonでdatetimeがすでにひどいのは知っていますが、これは本当に理不尽を通り越して、単なる愚かさの域に達しています。

これが真実でないと言ってください。

どのように解決するのですか?

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