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
.
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
.
Beachten Sie, dass ab Python 3.2 die datetime
Modul enthält datetime.timezone
. Die Dokumentation für datetime.utcnow()
sagt:
Eine bekannte aktuelle UTC-Datumszeit kann durch den Aufruf von
datetime.now
(
timezone.utc
)
.
Also, datetime.utcnow()
setzt nicht tzinfo
um anzuzeigen, dass es sich um UTC handelt, aber datetime.now(datetime.timezone.utc)
gibt die UTC-Zeit zurück mit tzinfo
gesetzt.
Das können Sie tun:
>>> import datetime
>>> datetime.datetime.now(datetime.timezone.utc)
datetime.datetime(2014, 7, 10, 2, 43, 55, 230107, tzinfo=datetime.timezone.utc)
Das bedeutet, dass es nicht auf die Zeitzone abgestimmt ist, so dass Sie es nicht mit datetime.astimezone
können Sie ihm eine Zeitzone wie folgt zuweisen
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
jetzt können Sie die Zeitzonen ändern
print(u.astimezone(pytz.timezone("America/New_York")))
Um die aktuelle Zeit in einer bestimmten Zeitzone zu erhalten, können Sie tzinfo an datetime.now()
direkt:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Es funktioniert für jede Zeitzone, einschließlich derjenigen, die die Sommerzeit einhalten, d.h. es funktioniert für Zeitzonen, die zu verschiedenen Zeiten unterschiedliche UTC-Offsets haben können (nicht-fixer UTC-Offset). Verwenden Sie nicht tz.localize(datetime.now())
-- es kann bei der Umstellung auf die Sommerzeit fehlschlagen, wenn die Ortszeit nicht eindeutig ist.
Die Standard-Python-Bibliotheken enthielten bis Python 3.2 keine tzinfo-Klassen. Über die Gründe kann ich nur mutmaßen. Persönlich denke ich, dass es ein Fehler war, keine tzinfo-Klasse für UTC aufzunehmen, weil diese Klasse unumstritten genug ist, um eine Standardimplementierung zu haben. Obwohl es keine Implementierung in der Bibliothek gab, ist eine solche als Beispiel in der tzinfo
Dokumentation .
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Sobald Sie eine UTC haben tzinfo
Objekts, können Sie es trotzdem nicht mit utcnow
. Um die aktuelle Zeit als bewusstes datetime-Objekt zu erhalten:
from datetime import datetime
now = datetime.now(utc)
In Python 3.2 haben sie endlich eine UTC tzinfo
Klasse in der Bibliothek:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
In Python 3.9 haben sie tzinfo
Klassen für alle anderen Zeitzonen. Siehe PEP 615 -- Unterstützung für die IANA-Zeitzonendatenbank in der Standardbibliothek für alle Einzelheiten.
En pytz
Modul ist eine Möglichkeit, und es gibt eine weitere python-dateutil
das zwar auch ein Paket eines Drittanbieters ist, aber je nach Ihren anderen Abhängigkeiten und Ihrem Betriebssystem bereits verfügbar sein kann.
Ich wollte diese Methodik nur als Referenz einfügen - wenn Sie bereits Folgendes installiert haben python-dateutil
für andere Zwecke verwenden, können Sie seine tzinfo
statt einer Vervielfältigung mit pytz
import datetime
import dateutil.tz
# Get the UTC time with datetime.now:
utcdt = datetime.datetime.now(dateutil.tz.tzutc())
# Get the UTC time with datetime.utcnow:
utcdt = datetime.datetime.utcnow()
utcdt = utcdt.replace(tzinfo=dateutil.tz.tzutc())
# For fun- get the local time
localdt = datetime.datetime.now(dateutil.tz.tzlocal())
Ich neige dazu, zuzustimmen, dass Aufrufe zu utcnow
sollte die Information über die UTC-Zeitzone enthalten. Ich vermute, dass dies nicht enthalten ist, weil die systemeigene datetime-Bibliothek aus Kompatibilitätsgründen standardmäßig naive Datumsangaben verwendet.
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.