Ich musste nie Zeit von und nach UTC umrechnen. Vor kurzem hatte ich die Bitte, meine App zeitzonenabhängig zu machen, und ich habe mich selbst im Kreis geführt. Viele Informationen zum Konvertieren der Ortszeit in UTC, die ich als ziemlich elementar empfand (vielleicht mache ich das auch falsch), aber ich kann keine Informationen zum einfachen Konvertieren der UTC-Zeit in die Zeitzone des Endbenutzers finden.
Kurz gesagt, die Android App sendet mir Daten (Appengine App) und innerhalb dieser Daten befindet sich ein Zeitstempel. Um diesen Zeitstempel in der von mir verwendeten Zeit zu speichern:
datetime.utcfromtimestamp(timestamp)
Das scheint zu funktionieren. Wenn meine App die Daten speichert, werden sie 5 Stunden im Voraus gespeichert (ich bin EST -5).
Die Daten werden in der BigTable von Appengine gespeichert und beim Abrufen als Zeichenfolge wie folgt ausgegeben:
"2011-01-21 02:37:21"
Wie konvertiere ich diese Zeichenfolge in eine DateTime in der korrekten Zeitzone des Benutzers?
Was ist der empfohlene Speicher für Zeitzoneninformationen eines Benutzers? (Wie speichert man normalerweise tz-Informationen, dh: "-5: 00" oder "EST" usw. usw.?) Ich bin sicher, dass die Antwort auf meine erste Frage einen Parameter enthält, der die Antworten auf die zweite Frage enthält.
Antworten:
Wenn Sie keine eigenen
tzinfo
Objekte bereitstellen möchten, lesen Sie die Python-Dateutil- Bibliothek. Es bietettzinfo
Implementierungen über einer Zoneinfo (Olson) -Datenbank , sodass Sie mit einem etwas kanonischen Namen auf Zeitzonenregeln verweisen können.Bearbeiten Erweitertes Beispiel, um die
strptime
Verwendung anzuzeigenBearbeiten 2 Feste API-Verwendung, um eine bessere Einstiegspunktmethode anzuzeigen
Bearbeiten 3 Enthaltene automatische Erkennungsmethoden für Zeitzonen (Yarin)
quelle
dateutil.tz
und zu verwendentz.tzutc()
undtz.tzlocal()
als Zeitzone - Objekte die ich suchte. Es sieht so aus, als ob die Zeitzonendatenbank auf meinem System gut ist (ich habe eingecheckt/usr/share/zoneinfo
). Ich bin mir nicht sicher, was los war.tz
Modul ist der richtige Einstiegspunkt für diese Bibliothek. Ich habe meine Antwort aktualisiert, um dies widerzuspiegeln. Dasdateutil.zoneinfo
Modul, das ich zuvor gezeigt habe, wird vomtz
Modul intern als Ersatz verwendet, wenn es die Zoneinfo-Datenbank des Systems nicht finden kann. Wenn Sie in die Bibliothek schauen, werden Sie feststellen, dass das verwendete Paket einen Zoneinfo-DB-Tarball enthält, wenn die DB Ihres Systems nicht gefunden werden kann. Mein altes Beispiel war der Versuch, diese Datenbank direkt zu treffen, und ich vermute, Sie hatten Probleme beim Laden dieser privaten Datenbank (ist sie nicht irgendwie auf dem Python-Pfad?)dateutil
, verwenden Siepytz
stattdessen .Hier ist eine ausfallsichere Methode, die nicht von externen Bibliotheken abhängt:
Dies vermeidet die Zeitprobleme in DelboyJays Beispiel. Und die geringeren zeitlichen Probleme in Erik van Oostens Änderungsantrag.
Interessanterweise kann der oben berechnete Zeitzonenversatz von dem folgenden scheinbar äquivalenten Ausdruck abweichen, wahrscheinlich aufgrund von Änderungen der Sommerzeitregeln:
Update: Dieses Snippet hat die Schwäche, den UTC-Offset der aktuellen Zeit zu verwenden, der vom UTC-Offset der eingegebenen Datumszeit abweichen kann. In den Kommentaren zu dieser Antwort finden Sie eine andere Lösung.
Um die verschiedenen Zeiten zu umgehen, nehmen Sie die Epochenzeit der verstrichenen Zeit. Hier ist, was ich tue:
quelle
pytz
db ist nicht möglich, siehe PEP-431. Obwohl Sie eine reine stdlib-Lösung schreiben können, die in solchen Fällen auf Systemen funktioniert, die bereits eine historische Zeitzonen-Datenbank haben, z. B. Linux, OS X, siehe meine Antwort .utc_datetime
.Siehe die datetime- Dokumentation zu tzinfo- Objekten. Sie müssen die Zeitzonen implementieren, die Sie selbst unterstützen möchten. Dies sind Beispiele am Ende der Dokumentation.
Hier ist ein einfaches Beispiel:
Ausgabe
quelle
replace
Sie diese Option, um die Zeitzone auf GMT einzustellen und die Zeitzone "bewusst" zu machen. Verwenden Sieastimezone
sie dann , um in eine andere Zeitzone zu konvertieren.Wenn Sie das richtige Ergebnis auch für die Zeit erhalten möchten, die einer mehrdeutigen Ortszeit entspricht (z. B. während eines Sommerzeitübergangs) und / oder der lokale UTC-Offset zu verschiedenen Zeiten in Ihrer lokalen Zeitzone unterschiedlich ist, verwenden Sie
pytz
Zeitzonen:quelle
Diese Antwort sollte hilfreich sein, wenn Sie keine anderen Module verwenden möchten
datetime
.datetime.utcfromtimestamp(timestamp)
gibt ein naivesdatetime
Objekt zurück (kein bewusstes). Bewusste sind zeitzonenbewusst und naiv nicht. Sie möchten eine bewusste, wenn Sie zwischen Zeitzonen konvertieren möchten (z. B. zwischen UTC und Ortszeit).Wenn Sie nicht derjenige sind, der das Datum zu Beginn instanziiert, aber dennoch ein naives
datetime
Objekt in UTC-Zeit erstellen können, sollten Sie diesen Python 3.x-Code ausprobieren, um es zu konvertieren:Achten Sie darauf, nicht fälschlicherweise anzunehmen, dass die Sommerzeit mit dem oben genannten Code nicht funktioniert, wenn Ihre Zeitzone derzeit MDT ist, da MST gedruckt wird. Sie werden feststellen, dass MDT gedruckt wird, wenn Sie den Monat auf August ändern.
Eine andere einfache Möglichkeit, ein bewusstes
datetime
Objekt (auch in Python 3.x) abzurufen, besteht darin, es mit einer Zeitzone zu erstellen, mit der zunächst begonnen wurde. Hier ist ein Beispiel mit UTC:Wenn Sie Python 2.x verwenden, müssen Sie wahrscheinlich eine Unterklasse
datetime.tzinfo
verwenden, um ein bewusstesdatetime
Objekt zu erstellen , dadatetime.timezone
es in Python 2.x nicht vorhanden ist.quelle
Wenn Sie Django verwenden, können Sie die folgende
timezone.localtime
Methode verwenden:quelle
Sie können Pfeil verwenden
Sie können
arrow.get()
mit allem füttern . Zeitstempel, ISO-String usw.quelle
Ich verschiebe dies traditionell auf das Frontend - sende Zeiten vom Backend als Zeitstempel oder ein anderes Datum / Uhrzeit-Format in UTC, lasse dann den Client den Zeitzonenversatz herausfinden und rendere diese Daten in der richtigen Zeitzone.
Für eine Webanwendung ist dies in Javascript ziemlich einfach. Sie können den Zeitzonenversatz des Browsers mithilfe integrierter Methoden ziemlich einfach ermitteln und dann die Daten aus dem Backend ordnungsgemäß rendern.
quelle
Sie können verwenden
calendar.timegm
, um Ihre Zeit seit der Unix-Epoche in Sekundentime.localtime
umzuwandeln und zurück zu konvertieren:Gibt
Fri Jan 21 05:37:21 2011
(weil ich in UTC + 03: 00 Zeitzone bin).quelle
Zum Beispiel ist meine Zeitzone ' +08: 00 '. Eingabe utc = 2018-10-17T00: 00: 00.111Z , dann erhalte ich Ausgabe = 2018-10-17T08: 00: 00 + 08: 00
quelle
Aus der Antwort hier können Sie das Zeitmodul verwenden, um von utc in die auf Ihrem Computer eingestellte Ortszeit zu konvertieren:
quelle
Hier ist eine schnelle und schmutzige Version, die die lokalen Systemeinstellungen verwendet, um den Zeitunterschied zu ermitteln. HINWEIS: Dies funktioniert nicht, wenn Sie in eine Zeitzone konvertieren müssen, in der Ihr aktuelles System nicht ausgeführt wird. Ich habe dies mit UK-Einstellungen unter BST-Zeitzone getestet
quelle
datetime.fromtimestamp(ts)
: Posix-Zeitstempel (Float-Sekunden) -> Datum / Uhrzeit-Objekt in lokaler Zeit (es funktioniert gut, wenn sich das Betriebssystem vergangene UTC-Offsets für die lokale Zeitzone merkt, dh unter Unix, aber nicht unter Windows für Daten in der Vergangenheit)). Andernfalls könnte Pytz verwendet werden.offset = datetime.utcnow().replace(minute=0, second=0, microsecond=0) - datetime.now().replace(minute=0, second=0, microsecond=0)
Ich habe seltsame Mikrosekundenunterschiede ohne sie.datetime.fromtimestamp(ts)
statt der antwort versucht ?Konsolidierung der Antwort von Franksand zu einer bequemen Methode.
quelle