Python: UTC-Zeittupel in UTC-Zeitstempel konvertieren

Mein Problem: Ich muss ein UTC-Zeittupel in einen UTC-Zeitstempel konvertieren. Aber ich habe einige Verwirrungen.

Zuerst ein paar Infos:

time.mktime(tuple): Diese Funktion gibt immer den Zeitstempel in zurücklokal Zeit.

Dies ist die Umkehrfunktion von localtime (). Sein Argument ist struct_time oder vollständiges 9-Tupel, das die Zeit in ausdrücktOrtszeit, nicht UTC.

calendar.timegm(tuple): Dies gibt dieUTC-Zeitstempel aus dem mitgelieferten Zeittupel

Nimmt ein Zeittupel, wie es von der Funktion gmtime () im Zeitmodul zurückgegeben wird, und gibt den entsprechenden Unix-Zeitstempelwert zurück. Eigentlich,time.gmtime () und timegm () sind gegenseitig umgekehrt

Jetzt machen wir einen Test:

>>> from datetime import datetime
>>> import time
>>> import calendar as cal

>>> utc_now = datetime.utcnow()
>>> now = datetime.now()
>>> utc_now
datetime.datetime(2013, 3, 16, 9, 17, 22, 489225)
>>> now
datetime.datetime(2013, 3, 16, 5, 17, 29, 736903)

>>> time.mktime(datetime.timetuple(utc_now)), time.mktime(datetime.timetuple(now))
(1363439842.0, 1363425449.0)
>>> cal.timegm(datetime.timetuple(utc_now)), cal.timegm(datetime.timetuple(now))
(1363425442, 1363411049)

Warum gibt es vier verschiedene Werte? Und welches ist richtig, wenn ich ein UTC-Zeittupel in einen UTC-Zeitstempel umwandeln möchte?

UPDATTE

Ich glaube, ich habe Antworten auf meine Verwirrungen gefunden. Lassen Sie mich das erklären.

Zuerst müssen wir etwas Wichtiges wissen:

Es gibt zwei Arten von Datums- und Uhrzeitobjekten: "naiv" und "bewusst".

Ein bewusstes Objekt verfügt über ausreichende Kenntnisse über anwendbare algorithmische und politische Zeiteinstellungen, z. B. Zeitzonen- und Sommerzeitinformationen, um sich relativ zu anderen bewusstem Objekten zu lokalisieren. Ein bewusstes Objekt wird verwendet, um einen bestimmten Zeitpunkt darzustellen, der nicht interpretiert werden kann [1].

Ein naives Objekt enthält nicht genügend Informationen, um sich im Verhältnis zu anderen Datums- / Zeitobjekten eindeutig zu lokalisieren.Ob ein naives Objekt die koordinierte Weltzeit (UTC), die Ortszeit oder die Zeit in einer anderen Zeitzone darstellt, bleibt dem Programm überlassen, ebenso wie es dem Programm überlassen ist, ob eine bestimmte Zahl Meter, Meilen oder Masse darstellt. Naive Objekte sind leicht zu verstehen und zu bearbeiten, wobei einige Aspekte der Realität zu vernachlässigen sind.

Was bekommen wir vondatetime.utcnow() oderdatetime.now() sind "naive" Objekte. Dies bedeutet, dass diedatetime Das zurückgegebene Objekt sagt sowieso nichts über Ihre Ortszeit oder UTC-Zeit aus - es steht nur für "einige Zeit". Es enthält lediglich Datums- und Zeitangaben (Jahr, Monat, Tag, Stunde, Minuten, Sekunden usw.). Es liegt in IHRER Verantwortung, dies mit dem Begriff lokal oder UTC in Verbindung zu bringen.

Denken Sie also daran, dass ein naives datetime-Objekt nur "einige Zeit" darstellt. Dasdatetime.now() Die Funktion gibt eine "einige Zeit" zurück, die der aktuellen Zeit entsprichtdatetime.utcnow() Funktion gibt "einige Zeit" zurück, die die aktuelle Zeit in Greenwich England ist (was UTC ist).

Das "einige Zeit" ist nur ein Wert für Datum und Uhrzeit. Und beachten Sie, dass an verschiedenen Orten auf der Erde die "einige Zeit" zu verschiedenen Zeiten auftritt. Wenn zum Beispiel ein Wert für "einige Zeit" der 1. Januar, 10:30 Uhr ist, ist dies die aktuelle Zeit in Greenwich, England, ungefähr 5 Stunden VOR der aktuellen Zeit in New York.

Daher können wir sehen, dass es zwei Dinge gibt: einen generischen Wert für "einige Zeit" und die Vorstellung, dass "einige Zeit" an verschiedenen Orten zu verschiedenen "Zeiten" zur aktuellen Zeit wird. (kein Wortspiel hier, lesen Sie weiter)

Nun definieren wir zunächst, was "Epoche" ist. Wir wissen, dass "einige Zeit" nur ein allgemeiner Zeitwert ist. Dann ist die Epoche eine "einige Zeit", die in Greenwich England stattgefunden hat, wo die Werte der Parameter sind:January 1 1970, 00:00:00.

Ein "Zeitstempel" ist nein. von Sekunden, die seit der Epoche vergangen sind. Dies bedeutet, dass der Zeitstempel war0 als die Zeit warJan 1, 1970, 00:00:00 in Greenwich England. Aber der Zeitstempel war ca. (5 * 60 * 60) als Zeit warJan 1, 1970, 00:00:00 in New York.

>>> tt = datetime.timetuple(datetime(1970, 1, 1, 0, 0, 0))
>>> cal.timegm(tt)
0

So können wir sehen, dass der gleiche "einige Zeit" Wert vonJan 1, 1970, 00:00:00 hat unterschiedliche Zeitstempel, wenn wir den Standort wechseln. Wenn Sie also über Zeitstempel sprechen, müssen Sie auch sagen, auf welchen Ort sich der Zeitstempel bezieht und wie viel nach Osten oder Westen sich dieser Ort auf Greenwich England bezieht. Dieser Ort wird als "Zeitzone" ausgedrückt.

Jetzt ist auf jedem System (Computer) eine Zeitzone konfiguriert, und alle Zeitstempel, die sich auf diese Zeitzone beziehen, werden effektiv "lokal". Die UTC ist die globale Referenz.

Angenommen, Sie haben eineX Wert für "einige Zeit", der konvertiert zu:

Y Zeitstempel in Ihrer OrtszeitZ Zeitstempel in UTC

dann heißt das dasY Nein. Sekunden müssen "einige Zeit" verstreichen, um die aktuelle Zeit an Ihrem Standort und zu erhaltenZ Es werden keine Sekunden vergehen müssen, damit die aktuelle Zeit in Greenwich England "einige Zeit" wird.

Kommen wir nun endlich zu unseren Funktionen zurückmktime undtimegm. Diese brauchen ein Zeittupel, was nur eine weitere Darstellung für "einige Zeit" ist. Denken Sie daran, dass wir ihnen eine naive Zeit vorbeiführen, in der es keine Ahnung von lokaler oder UTC gibt.

Sagen wirX ist ein Zeittupel, das eine naive "einige Zeit" darstellt. Dann

mktime(X) wird die nr zurückgeben. von Sekunden, die vergehen müssen, damit Ihre aktuelle Ortszeit zu dieser "Zeit" wird, undtimegm(X) Gibt die Anzahl der Sekunden zurück, die aufgewendet werden müssen, um die aktuelle Zeit von Greenwich England dieser "Zeitspanne" gleichzusetzen.

Im obigen Beispielnow undutc_now stellen naive "einige Zeit" dar, und wenn wir diese "einige Zeit" -Werte einspeisenmktime undtimegmsie geben einfach die nr zurück. Anzahl der Sekunden, die für die entsprechenden Standorte (Ihr Standort und Greenwich England) vergehen müssen, damit die aktuelle Zeit "einige Zeit" ist.

Zurück zu meinem Problem: Ich muss ein UTC-Zeittupel in einen UTC-Zeitstempel konvertieren.

Erstens gibt es kein Konzept für "UTC-Zeit-Tupel" - es ist nur "einige Zeit". Wenn ich es in UTC konvertieren muss, benutze ich einfachtimegm:

cal.timegm(datetime.timetuple(utc_now))

Dies gibt mir den Zeitstempel für die aktuelle UTC-Zeit (d. h. die aktuelle "einige Zeit" in Greenwich England).

Antworten auf die Frage(1)

Ihre Antwort auf die Frage