web-dev-qa-db-ja.com

JSON日付文字列をPython datetimeに変換します

日付をJSONに変換すると、JavaScriptは日付を次の形式で保存します。

_2012-05-29T19:30:03.283Z
_

しかし、これをpython datetimeオブジェクトに入れる方法はわかりません。私はこれらを試しました:

_# Throws an error because the 'Z' isn't accounted for:
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f')

# Throws an error because '%Z' doesn't know what to do with the 'Z'
#  at the end of the string
datetime.datetime.strptime(obj[key], '%Y-%m-%dT%H:%M:%S.%f%Z')
_

私はjavascriptが文字列を公式のISO形式で保存していると思います。そのため、Pythonのdatetime.strptime()に文字列を読み取らせる方法があるはずです。

29
Chris Dutrow

次のフォーマットを試してください。

%Y-%m-%dT%H:%M:%S.%fZ

例えば:

>>> datetime.datetime.strptime('2012-05-29T19:30:03.283Z', '%Y-%m-%dT%H:%M:%S.%fZ')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)

日付のZは、UTC時間として解釈されることを意味するだけなので、無視しても情報が失われることはありません。この情報はここにあります: http://www.w3.org/TR/NOTE-datetime

42
Andrew Clark

別の方法を提供するために、 python-dateutil パッケージをインストールしても構わない場合は、 dateutil.parser.parse を使用できます。入力の形式はparseによって推測されることに注意してください。無効な入力は、正しくまたはその他の方法で解釈できます。

タイムゾーンなし

タイムゾーンを設定したくない場合は、内部ですべての時間をUTCとしてのみ表すと完全に問題ありません。

>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z', ignoretz=True)
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000)

タイムゾーンあり

datetime.datetime.strptimeとは異なり、parseへのこのデフォルトの呼び出しでは、UTCタイムゾーンが自動的に保持されることに注意してください。

>>> import dateutil.parser
>>> dateutil.parser.parse('2012-05-29T19:30:03.283Z')
datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=tzutc())

等しいかどうかのテストアサーションを行う必要がある場合、予期されるオブジェクトは次のように構成できます。

>>> import datetime
>>> datetime.datetime(2012, 5, 29, 19, 30, 3, 283000, tzinfo=dateutil.tz.tzutc())
7
Acumenus