Wie konvertiere ich eine Datums- / Uhrzeitzeichenfolge in Ortszeit in eine Zeichenfolge in UTC-Zeit ?
Ich bin mir sicher, dass ich das schon einmal gemacht habe, kann es aber nicht finden und SO wird mir (und anderen) hoffentlich in Zukunft dabei helfen.
Erläuterung : Wenn ich beispielsweise 2008-09-17 14:02:00
in meiner lokalen Zeitzone ( +10
) habe, möchte ich eine Zeichenfolge mit der entsprechenden UTC
Zeit generieren : 2008-09-17 04:02:00
.
Beachten Sie außerdem unter http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ , dass dies im Allgemeinen nicht möglich ist, da bei Sommerzeit und anderen Problemen keine eindeutige Konvertierung von Ortszeit zu erfolgt UTC-Zeit.
Antworten:
Analysieren Sie zunächst die Zeichenfolge in ein naives datetime-Objekt. Dies ist eine Instanz
datetime.datetime
ohne angehängte Zeitzoneninformationen. Siehe Dokumentation fürdatetime.strptime
Informationen zum Parsen der Datumszeichenfolge finden .Verwenden Sie die
pytz
Modul, das eine vollständige Liste der Zeitzonen + UTC enthält. Finden Sie heraus, was die lokale Zeitzone ist, erstellen Sie daraus ein Zeitzonenobjekt und bearbeiten Sie es und hängen Sie es an die naive Datumszeit an.Schließlich verwenden
datetime.astimezone()
Methode, um die Datums- und Uhrzeitangabe in UTC zu konvertieren.Quellcode unter Verwendung der lokalen Zeitzone "America / Los_Angeles" für die Zeichenfolge "2001-2-3 10:11:12":
Von dort aus können Sie die
strftime()
Methode verwenden, um die UTC-Datumszeit nach Bedarf zu formatieren:quelle
tzlocal.get_localzone()
erhalten die lokale Zeitzone alspytz
Tzinfo ObjektMit der Funktion utcnow () des datetime-Moduls kann die aktuelle UTC-Zeit abgerufen werden.
Wie der oben von Tom erwähnte Link: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/ sagt:
HINWEIS - Wenn sich Ihre Daten in einer Region befinden, in der die Sommerzeit verwendet wird, verwenden Sie
pytz
die Antwort von John Millikin und sehen Sie sich diese an.Wenn Sie die UTC-Zeit aus einer bestimmten Zeichenfolge abrufen möchten und das Glück haben, in einer Region auf der Welt zu sein, in der entweder keine Sommerzeit verwendet wird oder Daten nur von der UTC versetzt sind, ohne dass die Sommerzeit angewendet wird:
-> Ortszeit als Basis für den Offsetwert verwenden:
-> Oder von einem bekannten Offset mit datetime.timedelta ():
AKTUALISIEREN:
Da ist Python 3.2
datetime.timezone
verfügbar. Mit dem folgenden Befehl können Sie ein zeitzonenbewusstes Datum / Uhrzeit-Objekt generieren:Wenn Sie bereit sind, Zeitzonen-Konvertierungen vorzunehmen, lesen Sie Folgendes:
https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7
quelle
tzinfo.utcoffset() must return a whole number of minutes
.Dank @rofly ist die vollständige Konvertierung von String zu String wie folgt:
Meine Zusammenfassung der
time
/calendar
Funktionen:time.strptime
Zeichenfolge -> Tupel (keine Zeitzone angewendet, entspricht also Zeichenfolge)
time.mktime
Ortszeit Tupel -> Sekunden seit der Epoche (immer Ortszeit)
time.gmtime
Sekunden seit der Epoche -> Tupel in UTC
und
calendar.timegm
Tupel in UTC -> Sekunden seit der Epoche
time.localtime
Sekunden seit der Epoche -> Tupel in der lokalen Zeitzone
quelle
(always local time)
scheint falsch zu sein: Die Eingabe in mktime () ist Ortszeit, die Ausgabe ist Sekunden seit epoch (1970-01-01 00:00:00 +0000 (UTC)
), die nicht von der Zeitzone abhängt.Hier ist eine Zusammenfassung der gängigen Python-Zeitkonvertierungen.
Einige Methoden lassen Sekundenbruchteile fallen und sind mit (s) gekennzeichnet . Eine explizite Formel, wie
ts = (d - epoch) / unit
sie stattdessen verwendet werden kann (danke jfs).calendar.timegm(struct_time)
calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
(Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
calendar.timegm(dt.utctimetuple())
calendar.timegm(dt.utctimetuple())
time.gmtime(t)
(siehe Kommentar von jfs)
stz.localize(dt, is_dst=None).utctimetuple()
(Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
dt.utctimetuple()
dt.utctimetuple()
datetime.fromtimestamp(t, None)
(kann unter bestimmten Bedingungen fehlschlagen, siehe Kommentar von jfs unten)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
(kann keine darstellen, siehe Kommentar von jfs)
dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
dt.astimezone(tz).replace(tzinfo=None)
datetime.utcfromtimestamp(t)
datetime.datetime(*struct_time[:6])
(kann keine Schaltsekunden darstellen, siehe Kommentar von jfs)
stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
(Ausnahme bei DST-Übergängen, siehe Kommentar von jfs)
dt.astimezone(UTC).replace(tzinfo=None)
datetime.fromtimestamp(t, tz)
(kann für Nicht-Pytz-Zeitzonen fehlschlagen)
datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
(kann keine darstellen, siehe Kommentar von jfs)
stz.localize(dt, is_dst=None)
(Ausnahme bei Sommerzeitübergängen, siehe Kommentar von jfs)
dt.replace(tzinfo=UTC)
Quelle: taaviburns.ca
quelle
fromtimestamp(t, None)
kann fehlschlagen, wenn die lokale Zeitzone einen anderen utc-Offset hattet
und die C-Bibliothek keinen Zugriff auf die tz-Datenbank auf der angegebenen Plattform hat. Sie könnentzlocal.get_localzone()
tzdata auf tragbare Weise bereitstellen. (2)fromtimestamp(t, tz)
kann für Nicht-Pytz-Zeitzonen fehlschlagen. (3)datetime(*struct_time[:6])
Sie fehlen*
. (4)timegm()
,utctimetuple()
,struct_time
Drop -basierten Lösungen von Bruchteilen einer Sekunde. Sie könnents = (d - epoch) / unit
stattdessen eine explizite Formel wie: verwenden.stz.localize(dt, is_dst=None)
löst eine Ausnahme für mehrdeutige oder nicht vorhandene Ortszeiten aus, z. B. während der Sommerzeitübergänge. Verwenden Siestz.normalize(stz.localize(dt))
diese Option, um die Ausnahme zu vermeiden. Dies kann zu ungenauen Ergebnissen führen. (6) datetime () kann keine Schaltsekunde darstellen. Konvertieren Siestruct_time
zuerst als Problemumgehung in "Sekunden seit der Epoche". (7) Imtime.gmtime(t)
Gegensatz zucalendar.timegm()
möglicherweise wird eine Nicht-POSIX-Eingabe erwartet, wenn die "richtige" Zeitzone verwendet wird. Verwenden Sie die explizite Formel, wenn die Eingabe stattdessen POSIX ist:gmtime = lambda t: datetime(1970,1,1, tzinfo=utc) + timedelta(seconds=t)
<table>
Tags. Entschuldigung. Dies ist beabsichtigt und beabsichtigt. Wenn Sie eine schnelle und schmutzige" Tabelle "benötigen, verwenden Sie ein<pre>
ASCII-Layout." Ich glaube nicht, dass eine ASCII-Tabelle besser lesbar wäre als die obige Liste.Quelle: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html
Anwendungsbeispiel von bd808 : Wenn Ihre Quelle ein
datetime.datetime
Objekt istt
, rufen Sie Folgendes auf :quelle
t
, rufen Sie Folgendes auf: local_to_utc (t.timetuple ()).timetuple()
Anruf setzttm_isdst
auf-1
;mktime()
Während des DST-Übergangs besteht eine 50% ige Wahrscheinlichkeit, dass ein Fehler auftritt.Ich habe viel Glück mit Dateutil (das auf SO für andere verwandte Fragen allgemein empfohlen wird):
(Der Code wurde aus dieser Antwort zum Konvertieren der UTC-Datums- / Uhrzeitzeichenfolge in die lokale Datums- / Uhrzeitangabe abgeleitet. )
quelle
dateutil
kann für vergangene Daten fehlschlagen, wenn die lokale Zeitzone auf Systemen, auf denen die Implementierung keine historische Zeitzonendatenbank verwendet (insbesondere Windows), einen anderen UTC-Offset als (unabhängig von den Sommerzeitübergängen) hatte.pytz
+tzlocal
könnte stattdessen verwendet werden.Ein weiteres Beispiel mit pytz, enthält aber localize (), was meinen Tag gerettet hat.
quelle
Ich hatte den größten Erfolg mit Python-Dateutil :
quelle
dateutil
kann für vergangene Daten scheiternquelle
mktime(dt.timetuple())
kann während des DST-Übergangs fehlschlagen . Es gibtLocalTimezone
in den Dokumenten (es funktioniert für die neueste Zeitzonendefinition, kann aber für vergangene Daten fehlschlagen (nicht im Zusammenhang mit der Sommerzeit))Wenn Sie datetime.datetime bevorzugen:
quelle
mktime()
erwartet Ortszeit als Eingabe.fromtimestamp()
Gibt die Ortszeit zurück, nicht utc. Wenn Sie es beheben, sehen Sie diese zusätzlichen Probleme (wiedateutil
, stdlib-only-Lösung kann fehlschlagen)Einfach
Ich habe es so gemacht:
Ausgefallene Implementierung
Wenn Sie Lust haben, können Sie daraus einen Funktor machen:
Ergebnis:
quelle
Sie können es tun mit:
quelle
Wie wäre es mit -
Wenn Sekunden sind
None
, wird die Ortszeit in UTC-Zeit konvertiert, andernfalls wird die übergebene Zeit in UTC konvertiert.quelle
Um die Sommerzeit usw. zu umgehen
Keine der obigen Antworten hat mir besonders geholfen. Der folgende Code funktioniert für GMT.
quelle
Verwenden von http://crsmithdev.com/arrow/
Diese Bibliothek macht das Leben einfach :)
quelle
Ich habe hier die beste Antwort auf eine andere Frage gefunden . Es werden nur in Python integrierte Bibliotheken verwendet, und Sie müssen keine lokale Zeitzone eingeben (in meinem Fall eine Anforderung).
Ich poste die Antwort hier erneut, da diese Frage in Google anstelle der verknüpften Frage in Abhängigkeit von den Suchbegriffen angezeigt wird.
quelle
Ich habe diesen Code in einem meiner Projekte:
quelle
In Python3:
pip install python-dateutil
quelle
from dateutil import tz
Wie wäre es mit -
Wenn Sekunden sind
None
, wird die Ortszeit in UTC-Zeit konvertiert, andernfalls wird die übergebene Zeit in UTC konvertiert.quelle