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」を交換することを%z
UTCにパース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オフセットである可能性もあります。