Ich habe eine Python-Datetime-Instanz, die mit datetime.utcnow () erstellt und in der Datenbank beibehalten wurde.
Zur Anzeige möchte ich die aus der Datenbank abgerufene datetime-Instanz unter Verwendung der lokalen Standardzeitzone in die lokale datetime konvertieren (dh, als ob die datetime mit datetime.now () erstellt worden wäre).
Wie kann ich die UTC-Datumszeit in eine lokale Datumszeit konvertieren, indem ich nur die Python-Standardbibliothek verwende (z. B. keine Pytz-Abhängigkeit)?
Es scheint, dass eine Lösung darin besteht, datetime.astimezone (tz) zu verwenden, aber wie würden Sie die lokale Standardzeitzone erhalten?
python
datetime
timezone
python-datetime
Nitro Zark
quelle
quelle
Antworten:
In Python 3.3+:
In Python 2/3:
Verwenden
pytz
(beide Python 2/3):Beispiel
Ausgabe
Python 3.3 Python 2 PytzHinweis: Es berücksichtigt die Sommerzeit und die jüngste Änderung des UTC-Offsets für die MSK-Zeitzone.
Ich weiß nicht, ob Nicht-Pytz-Lösungen unter Windows funktionieren.
quelle
.normalize()
da die Quellzeitzone für.astimezone()
UTC ist.TypeError: replace() takes no keyword arguments
beim Ausprobieren die Pytz-Lösung.local_dt.replace(tzinfo=None).astimezone(tz=timezone.utc)
Sie können dies nicht nur mit der Standardbibliothek tun, da die Standardbibliothek keine Zeitzonen hat. Sie benötigen Pytz oder Dateutil .
Oder Sie können es ohne Pytz oder Dateutil tun, indem Sie Ihre eigenen Zeitzonen implementieren. Aber das wäre dumm.
quelle
Sie können es nicht mit Standardbibliothek tun. Mit dem Pytz- Modul können Sie jedes naive / bewusste Datum / Uhrzeit-Objekt in eine andere Zeitzone konvertieren. Sehen wir uns einige Beispiele mit Python 3 an.
Um ein naives Objekt in eine andere Zeitzone zu konvertieren, müssen Sie es zuerst in ein bewusstes Datum / Uhrzeit-Objekt konvertieren . Sie können die
replace
Methode zum Konvertieren eines naiven Datetime-Objekts in ein bewusstes Datetime-Objekt verwenden. Um ein bewusstes Datum / Uhrzeit-Objekt in eine andere Zeitzone zu konvertieren , können Sie dieastimezone
Methode verwenden.Die Variable
pytz.all_timezones
gibt Ihnen die Liste aller verfügbaren Zeitzonen im Pytz-Modul.Da die
now
Methode das aktuelle Datum und die aktuelle Uhrzeit zurückgibt, müssen Sie zuerst die Zeitzone des Datetime-Objekts berücksichtigen. Dielocalize
Funktion konvertiert ein naives datetime-Objekt in ein zeitzonenbewusstes datetime-Objekt. Anschließend können Sie dieastimezone
Methode verwenden, um sie in eine andere Zeitzone zu konvertieren.quelle
Ich glaube, ich habe es herausgefunden: Berechnet die Anzahl der Sekunden seit der Epoche, konvertiert dann mit time.localtime in einen lokalen Timzeone und konvertiert dann die Zeitstruktur zurück in eine datetime ...
Die Sommer- / Winter-Sommerzeit wird korrekt angewendet:
quelle
utctotimestamp(utc_dt) -> (seconds, microseconds)
aus Gründen der Klarheit aus Ihrem Code extrahieren , siehe Python 2.6-3.x-ImplementierungAufbauend auf Alexeis Kommentar. Dies sollte auch für die Sommerzeit funktionieren.
quelle
Die Standard-Python-Bibliothek enthält überhaupt keine
tzinfo
Implementierungen. Ich habe dies immer als überraschendes Manko des datetime-Moduls angesehen.Die Dokumentation für die tzinfo-Klasse enthält einige nützliche Beispiele. Suchen Sie nach dem großen Codeblock am Ende des Abschnitts.
quelle
os
Modul hätte basierend auf den Betriebssystemfunktionen eine für die Ortszeit bereitstellen können.Python 3.9 fügt das
zoneinfo
Modul hinzu, sodass es jetzt wie folgt ausgeführt werden kann (nur stdlib):Mitteleuropa ist 1 oder 2 Stunden vor UTC, also
local_aware
:als
str
:Windows hat keine Systemzeitzonendatenbank, daher wird hier ein zusätzliches Paket benötigt:
Es gibt einen Backport, der die Verwendung in Python 3.6 bis 3.8 ermöglicht :
Dann:
quelle
Eine einfache (aber möglicherweise fehlerhafte) Methode, die in Python 2 und 3 funktioniert:
Sein Vorteil ist, dass es trivial ist, eine inverse Funktion zu schreiben
quelle
time.timezone
die Sommerzeit nicht berücksichtigt wird.Der einfachste Weg, den ich gefunden habe, besteht darin, den Zeitversatz von Ihrem Standort zu ermitteln und diesen dann von der Stunde abzuziehen.
Dies funktioniert bei mir in Python 3.5.2.
quelle
Hier ist eine andere Möglichkeit, die Zeitzone im Datum / Uhrzeit-Format zu ändern (ich weiß, dass ich meine Energie dafür verschwendet habe, aber ich habe diese Seite nicht gesehen, also weiß ich nicht wie), ohne min. und sek. weil ich es für mein Projekt nicht brauche:
quelle
Dies ist ein schrecklicher Weg, aber es wird vermieden, eine Definition zu erstellen. Es erfüllt die Anforderung, sich an die grundlegende Python3-Bibliothek zu halten.
quelle
Verwenden Sie timedelta, um zwischen Zeitzonen zu wechseln. Sie benötigen lediglich den Versatz in Stunden zwischen den Zeitzonen. Sie müssen nicht mit den Grenzen für alle 6 Elemente eines datetime-Objekts herumspielen. timedelta bewältigt auch Schaltjahre, Schaltjahrhundert usw. mühelos. Sie müssen zuerst
Wenn
offset
dann das Zeitzonendelta in Stunden ist:timeout = timein + timedelta(hours = offset)
Dabei sind timein und timeout datetime-Objekte. z.B
timein + timedelta(hours = -8)
konvertiert von GMT zu PST.
Also, wie zu bestimmen
offset
? Hier ist eine einfache Funktion, vorausgesetzt, Sie haben nur wenige Möglichkeiten zur Konvertierung, ohne datetime-Objekte zu verwenden, die zeitzonenbewusst sind, was einige andere Antworten gut tun. Ein bisschen manuell, aber manchmal ist Klarheit am besten.Nachdem ich mir die zahlreichen Antworten angesehen und mit dem engsten Code herumgespielt habe, den ich mir (vorerst) vorstellen kann, scheint es am besten, dass alle Anwendungen, bei denen Zeit wichtig ist und gemischte Zeitzonen berücksichtigt werden müssen, echte Anstrengungen unternehmen sollten, um alle Datums- / Uhrzeitobjekte zu erstellen "bewusst". Dann scheint die einfachste Antwort zu sein:
zum Beispiel auf GMT umstellen. Um in eine andere Zeitzone zu konvertieren, die lokal oder anderweitig gewünscht wird, verwenden Sie einfach die entsprechende Zeitzonenzeichenfolge, die pytz versteht (aus pytz.all_timezones). Die Sommerzeit wird dann ebenfalls berücksichtigt.
quelle