datetime: Zeitstempel mit Zeitzonenversatz abrufen

Nov 23 2020

Ich möchte den Zeitstempel von Daten in den folgenden Formaten erhalten:

Mon, 23 Nov 2020 19:00:00 GMT
Mon, 23 Nov 2020 20:00:00 +0100

Ich verwende die folgenden Anweisungen, um Datumsangaben in datetimeObjekte umzuwandeln :

dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %Z')
dateobj = datetime.datetime.strptime(date, '%a, %d %b %Y %H:%M:%S %z')

Bei Verwendung der .timestamp()Methode werden jedoch andere Sekunden als in der Epoche gedruckt. Warum fügt die %ZDirektive dem datetimeObjekt keine Zeitzoneninformationen hinzu ? Wie kann ich die Zeitzone berücksichtigen, damit der Zeitstempel gleich ist?

Antworten

MrFuppes Nov 24 2020 at 07:21

Bitte beachten Sie, dass die Zeitzone in Python inkonsistent ist . Ihr Problem ist %Z, macht es strptime akzeptiert bestimmte Zeichenfolge (GMT, UTC und jeder Wert in time.tzname - docs ), aber eigentlich nichts daraus zu machen. Das zurückgegebene datetime-Objekt ist naiv. Aus diesem Grund nimmt Python die Ortszeit an, wenn Sie die timestamp()Methode aufrufen .

Sie können stattdessen den Parser von dateutil verwenden:

from dateutil.parser import parse

for s in ("Mon, 23 Nov 2020 19:00:00 GMT", "Mon, 23 Nov 2020 20:00:00 +0100"):
    dt = parse(s)
    print(repr(dt), dt.timestamp())

# datetime.datetime(2020, 11, 23, 19, 0, tzinfo=tzutc()) 1606158000.0
# datetime.datetime(2020, 11, 23, 20, 0, tzinfo=tzoffset(None, 3600)) 1606158000.0