Inkonsistente Datums- / Zeitanalyse-Zeitzone in Python

Nov 23 2020

Wenn ich in Python 3.X Folgendes ausführe

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)

Ich bekomme

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

Warum sind die Zeitzoneninformationen verschwunden und wie kann ich dieses Problem beheben?

Antworten

2 MrFuppes Nov 24 2020 at 07:13

Inkonsequent in der Tat ... Der Punkt ist , dass %ZMarken strptime akzeptieren bestimmte Zeichenfolge (GMT, UTC und jeder Wert in time.tzname - docs ), aber nicht wirklich etwas daraus machen. Ex:

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)

Das resultierende Datum / Uhrzeit-Objekt ist naiv. Keine Anzeichen von UTC mehr.

Um dieses Verhalten zu berücksichtigen, können Sie das datetime-Objekt nachbearbeiten

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

(was ich für etwas schmerzhaft halte ...) oder "UTC" durch etwas ersetzen, %zdas nach UTC 1 analysiert wird ,

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)

(was ich ein bisschen hässlich finde ...) oder verwenden Sie einen geeigneten Parser, z

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

(was etwas langsamer sein wird, wenn die Leistung ein Problem darstellt ...).


1 IMO, das ist auch inkonsistent; "+00: 00" könnte auch der UTC-Versatz einer Zeitzone sein, die zu diesem Zeitpunkt zufällig einen UTC-Versatz von 0 Stunden hat ...