453 Stimmen

Warum enthält datetime.datetime.utcnow() keine Zeitzoneninformationen?

datetime.datetime.utcnow()

Warum ist das datetime keine Angaben zur Zeitzone, da es sich ausdrücklich um eine UTC datetime ?

Ich würde erwarten, dass dies Folgendes enthält tzinfo .

10voto

Joe D'Andrea Punkte 5121

Julien Danjou hat einen guten Artikel geschrieben, der erklärt warum Sie sich nie mit Zeitzonen beschäftigen sollten . Ein Auszug:

In der Tat, Python datetime was sehr unglücklich ist. In der Tat, sobald Sie eines dieser Objekts erhält, gibt es keine Möglichkeit, die Zeitzone zu ermitteln, weshalb diese Objekte für sich genommen ziemlich "nutzlos" sind.

Leider, auch wenn Sie die utcnow() Wenn Sie diese Option wählen, wird die Zeitzoneninformation immer noch nicht angezeigt, wie Sie festgestellt haben.

Empfehlungen:

  • Verwenden Sie immer bewusst datetime Objekte, d.h. mit Zeitzoneninformationen. Das stellt sicher, dass Sie sie direkt vergleichen können (aware und unaware datetime Objekte nicht vergleichbar sind) und gibt sie korrekt an die Benutzer zurück. Hebelwirkung pytz um Zeitzonenobjekte zu haben.

  • Utilisez ISO 8601 a Ausgabe-String-Format. verwenden datetime.datetime.isoformat() t Zeitstempel als String zurückgeben, der mit diesem Format formatiert ist, das die Zeitzonen-Informationen enthält.

  • Wenn Sie Zeichenketten mit ISO 8601-formatierten Zeitstempeln parsen müssen, können Sie sich auf iso8601 die den Zeitstempel zurückgibt Zeitzoneninformationen zurückgibt. Dies macht Zeitstempel direkt vergleichbar.

4voto

Hansol Shin Punkte 111

Das Verhalten von datetime.datetime.utcnow() Die Rückgabe der UTC-Zeit als naives datetime-Objekt ist offensichtlich problematisch und muss behoben werden. Es kann zu unerwarteten Ergebnissen führen, wenn die lokale Zeitzone Ihres Systems nicht UTC ist, da die datetime-Bibliothek davon ausgeht, dass ein naives datetime-Objekt die lokale Systemzeit darstellt. Zum Beispiel, datetime.datetime.utcnow().timestaamp() gibt einen Zeitstempel an, der 4 Stunden vor dem korrekten Wert auf meinem Computer liegt. Auch, ab Python 3.6, datetime.astimezone() kann für naive datetime-Instanzen aufgerufen werden, aber datetime.datetime.utcnow().astimezone(any_timezone) ergibt ein falsches Ergebnis, es sei denn, die lokale Zeitzone Ihres Systems ist UTC.

3voto

Smart Manoj Punkte 4319

Sie sollte Folgendes umfassen und now() auch. Verwandte Seiten Ausgabe .

So weit, so gut, now() ist vorzuziehen gegenüber today() y utcnow() .

from datetime import datetime, timezone
utc = timezone.utc
date = datetime.now(utc)
print(date) # 2022-04-06 05:40:13.025347+00:00

-7voto

from datetime import datetime 
from dateutil.relativedelta import relativedelta
d = datetime.now()
date = datetime.isoformat(d).split('.')[0]
d_month = datetime.today() + relativedelta(months=1)
next_month = datetime.isoformat(d_month).split('.')[0]

-16voto

UTC-Datumsangaben benötigen keine Angaben zur Zeitzone, da es sich um UTC handelt, was per Definition bedeutet, dass sie keinen Offset haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X