Ich habe es mit Datumsangaben in Python zu tun und muss sie in UTC-Zeitstempel konvertieren, um sie in Javascript zu verwenden. Der folgende Code funktioniert nicht:
>>> d = datetime.date(2011,01,01)
>>> datetime.datetime.utcfromtimestamp(time.mktime(d.timetuple()))
datetime.datetime(2010, 12, 31, 23, 0)
Das Konvertieren des Datumsobjekts zuerst in datetime hilft ebenfalls nicht. Ich habe das Beispiel unter diesem Link ausprobiert , aber:
from pytz import utc, timezone
from datetime import datetime
from time import mktime
input_date = datetime(year=2011, month=1, day=15)
und jetzt entweder:
mktime(utc.localize(input_date).utctimetuple())
oder
mktime(timezone('US/Eastern').localize(input_date).utctimetuple())
funktioniert.
Also allgemeine Frage: Wie kann ich ein Datum nach UTC in Sekunden seit der Epoche umrechnen lassen?
datetime.date
, der andere versucht, eine Zeichenfolgendarstellung von einer Zeitzone in eine andere zu konvertieren. Als jemand, der nach einer Lösung für dieses Problem sucht, kann ich möglicherweise nicht den Schluss ziehen, dass letzteres die Antwort liefert, nach der ich suche.Antworten:
Wenn
d = date(2011, 1, 1)
in UTC ist:Wenn
d
in der lokalen Zeitzone:timestamp1
undtimestamp2
kann abweichen, wenn Mitternacht in der lokalen Zeitzone nicht dieselbe Zeitinstanz wie Mitternacht in UTC ist.mktime()
kann ein falsches Ergebnis zurückgeben, wenn diesd
einer mehrdeutigen Ortszeit entspricht (z. B. während des DST-Übergangs) oder wennd
es sich um ein vergangenes (zukünftiges) Datum handelt, an dem der UTC-Offset möglicherweise anders war und das Cmktime()
keinen Zugriff auf die tz-Datenbank auf der angegebenen Plattform hat . Sie können daspytz
Modul (z. B. viatzlocal.get_localzone()
) verwenden, um auf allen Plattformen Zugriff auf die tz-Datenbank zu erhalten . Auchutcfromtimestamp()
kann fehlschlagen undmktime()
kann nicht-POSIX - Zeitstempel zurück , wenn"right"
Zeitzone verwendet wird .So konvertieren Sie ein
datetime.date
Objekt, das das Datum in UTC darstellt, ohnecalendar.timegm()
:Wie kann ich ein Datum nach UTC in Sekunden seit der Epoche umrechnen lassen?
Konvertieren von
datetime.datetime
(nichtdatetime.date
) Objekten, die bereits die Zeit in UTC darstellen, in den entsprechenden POSIX-Zeitstempel (afloat
).Python 3.3+
datetime.timestamp()
::Hinweis: Es muss
timezone.utc
explizit angegeben werden, andernfalls wird.timestamp()
davon ausgegangen, dass sich Ihr naives datetime-Objekt in der lokalen Zeitzone befindet.Python 3 (<3.3)
Aus den Dokumenten für
datetime.utcfromtimestamp()
:Interessante Lektüre: Epochenzeit vs. Tageszeit über den Unterschied zwischen Wie spät ist es? und wie viele Sekunden sind vergangen?
Siehe auch: datetime benötigt eine "Epochen" -Methode
Python 2
So passen Sie den obigen Code für Python 2 an:
Dabei
timedelta.total_seconds()
entspricht dies der(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6
Berechnung mit aktivierter wahrer Division.Beispiel
Vorsicht vor Gleitkomma-Problemen .
Ausgabe
So konvertieren Sie ein bewusstes
datetime
Objekt in einen POSIX-ZeitstempelAuf Python 3:
Auf Python 2:
quelle
timestamp = (dt - datetime.fromtimestamp(0)).total_seconds()
?datetime(1970, 1, 1)
ist expliziter.fromtimestamp()
ist hier falsch (dt
ist in UTC undutcfromtimestamp()
sollte stattdessen verwendet werden).totimestamp()
Funktion in der Antwort.Nur für Unix-Systeme :
Anmerkung 1: Dizzyf stellte fest, dass dies lokalisierte Zeitzonen anwendet . Nicht in der Produktion verwenden.
Anmerkung 2: Jakub Narębski stellte fest, dass dies Zeitzoneninformationen selbst für versatzbewusste Datums- und Uhrzeitangaben ignoriert (getestet für Python 2.7).
quelle
man strftime
Unix-ähnliche Systeme überprüfen .Annahme 1: Sie versuchen, ein Datum in einen Zeitstempel umzuwandeln. Da ein Datum jedoch einen Zeitraum von 24 Stunden abdeckt, gibt es keinen einzigen Zeitstempel, der dieses Datum darstellt. Ich gehe davon aus, dass Sie den Zeitstempel dieses Datums um Mitternacht (00: 00: 00.000) darstellen möchten.
Annahme 2: Das von Ihnen angegebene Datum ist keiner bestimmten Zeitzone zugeordnet. Sie möchten jedoch den Versatz von einer bestimmten Zeitzone (UTC) bestimmen. Ohne Kenntnis der Zeitzone, in der sich das Datum befindet, ist es nicht möglich, einen Zeitstempel für eine bestimmte Zeitzone zu berechnen. Ich gehe davon aus, dass Sie das Datum so behandeln möchten, als ob es in der Zeitzone des lokalen Systems liegt.
Zunächst können Sie die Datumsinstanz mithilfe des Elements in ein Tupel konvertieren, das die verschiedenen Zeitkomponenten darstellt
timetuple()
:Sie können dies dann in einen Zeitstempel konvertieren, indem Sie
time.mktime
:Sie können diese Methode überprüfen, indem Sie sie mit der Epochenzeit selbst (1970-01-01) testen. In diesem Fall sollte die Funktion den Zeitzonenversatz für die lokale Zeitzone an diesem Datum zurückgeben:
28800.0
beträgt 8 Stunden, was für die pazifische Zeitzone (in der ich mich befinde) korrekt wäre.quelle
Folgen Sie dem python2.7-Dokument. Sie müssen calendar.timegm () anstelle von time.mktime () verwenden.
quelle
d
es in UTC ist?Ich habe meine eigenen zwei Funktionen definiert
Hier:
quelle
Die Frage ist etwas verwirrt. Zeitstempel sind nicht UTC - sie sind eine Unix-Sache. das Datum könnte UTC sein? Angenommen, dies ist der Fall, und wenn Sie Python 3.2+ verwenden, macht das einfache Datum dies trivial:
Wenn Sie tatsächlich das Jahr, den Monat und den Tag haben, müssen Sie nicht Folgendes erstellen
date
:und wenn sich das Datum in einer anderen Zeitzone befindet (dies ist wichtig, da wir Mitternacht ohne zugehörige Zeit annehmen ):
[Die Idee hinter simple-date ist, alle Datums- und Zeitangaben von Python in einer konsistenten Klasse zu sammeln, damit Sie jede Konvertierung durchführen können. so wird es zum Beispiel auch in die andere Richtung gehen:
]]
quelle
SimpleDate(date(2011,1,1), tz='America/New_York')
erhöhtNoTimezone
, währendpytz.timezone('America/New_York')
keine Ausnahmen ausgelöst werden (simple-date==0.4.8
,pytz==2014.7
).pip install simple-date
, es sieht so aus, als wäre es nur Python3 / Pip3.Verwenden des Pfeilpakets :
quelle
arrow
Verwendetdateutil
unddateutil
kennt seit vielen Jahren Fehler im Zusammenhang mit der Zeitzonenbehandlung. Verwenden Sie es nicht, wenn Sie korrekte Ergebnisse für Zeitzonen mit einem nicht festen UTC-Versatz benötigen (es ist in Ordnung, es für die UTC-Zeitzone zu verwenden, aber die stdlib behandelt auch den UTC-Fall in Ordnung).Eine vollständige Zeitzeichenfolge enthält:
[+HHMM or -HHMM]
Beispielsweise:
1970-01-01 06:00:00 +0500
==1970-01-01 01:00:00 +0000
==UNIX timestamp:3600
Hinweis:
Bearbeiten:
quelle
1970-01-01 06:00:00 +0500
zu ,3600
wie Sie gefragt.timezone
Inpython2
, Sie können die Berechnung (06:00:00
-+0500
=01:00:00
) manuell durchführen.Wenn Sie ein
datetime
Objekt namens habend
, verwenden Sie Folgendes, um den Zeitstempel in UTC abzurufen:Verwenden Sie für die entgegengesetzte Richtung Folgendes:
quelle
Ich bin beeindruckt von der tiefen Diskussion.
meine 2 Cent:
ab datetime import datetime import time
der zeitstempel in utc ist:
oder,
Wenn jetzt aus datetime.now () resultiert, in derselben Sommerzeit
quelle