Pythonでの一貫性のない日時解析タイムゾーン

Nov 23 2020

Python3.Xで以下を実行すると

import datetime

DATE_TS_FORMAT = '%Y-%m-%d %H:%M:%S.%f %Z'

date_ts = datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
date_ts = datetime.datetime.strptime(date_ts, DATE_TS_FORMAT)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)

私は得る

2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000 

タイムゾーン情報が消えたのはなぜですか?この問題を修正するにはどうすればよいですか?

回答

2 MrFuppes Nov 24 2020 at 07:13

一貫性のないは確かに...ポイントは、ということである%Z作るがstrptime 受け入れ- (GMT、UTCとtime.tznameの任意の値特定の文字列をドキュメントが、実際にそれからは何も行いません)。例:

from datetime import datetime

s = "2019-01-02 03:04:05.000000 UTC"
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f %Z')

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5)

結果のdatetimeオブジェクトはナイーブです。UTCの兆候はもうありません。

この動作を説明するために、次のような日時オブジェクトを後処理できます。

if "UTC" in s: 
    dt = dt.replace(tzinfo=timezone.utc)

(私は考えている...少し痛いです)か何かで「UTC」を交換することを%zUTCにパース1

dt = datetime.strptime(s.replace("UTC", "+00:00"), '%Y-%m-%d %H:%M:%S.%f %z')

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)

(これは少し醜いと思います...)または適切なパーサーを使用します。

from dateutil.parser import parse

dt = parse(s)

print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=tzutc())

print(dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z'))
# 2019-01-02 03:04:05.000000 UTC

(パフォーマンスが問題になる場合は少し遅くなります...)。


1 IMO、これも一貫性がありません。「+00:00」は、その時点でUTCオフセットが0時間であるタイムゾーンのUTCオフセットである可能性もあります。