Wenn d = date(2011, 1, 1)in UTC ist:
>>> from datetime import datetime, date
>>> import calendar
>>> timestamp1 = calendar.timegm(d.timetuple())
>>> datetime.utcfromtimestamp(timestamp1)
datetime.datetime(2011, 1, 1, 0, 0)
Wenn din der lokalen Zeitzone:
>>> import time
>>> timestamp2 = time.mktime(d.timetuple()) # DO NOT USE IT WITH UTC DATE
>>> datetime.fromtimestamp(timestamp2)
datetime.datetime(2011, 1, 1, 0, 0)
timestamp1und timestamp2kann abweichen, wenn Mitternacht in der lokalen Zeitzone nicht dieselbe Zeitinstanz wie Mitternacht in UTC ist.
mktime()kann ein falsches Ergebnis zurückgeben, wenn dies deiner mehrdeutigen Ortszeit entspricht (z. B. während des DST-Übergangs) oder wenn des sich um ein vergangenes (zukünftiges) Datum handelt, an dem der UTC-Offset möglicherweise anders war und das C mktime()keinen Zugriff auf die tz-Datenbank auf der angegebenen Plattform hat . Sie können das pytzModul (z. B. via tzlocal.get_localzone()) verwenden, um auf allen Plattformen Zugriff auf die tz-Datenbank zu erhalten . Auch utcfromtimestamp()kann fehlschlagen und mktime()kann nicht-POSIX - Zeitstempel zurück , wenn "right"Zeitzone verwendet wird .
So konvertieren Sie ein datetime.dateObjekt, das das Datum in UTC darstellt, ohne calendar.timegm():
DAY = 24*60*60 # POSIX day in seconds (exact value)
timestamp = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * DAY
timestamp = (utc_date - date(1970, 1, 1)).days * DAY
Wie kann ich ein Datum nach UTC in Sekunden seit der Epoche umrechnen lassen?
Konvertieren von datetime.datetime(nicht datetime.date) Objekten, die bereits die Zeit in UTC darstellen, in den entsprechenden POSIX-Zeitstempel (a float).
Python 3.3+
datetime.timestamp()::
from datetime import timezone
timestamp = dt.replace(tzinfo=timezone.utc).timestamp()
Hinweis: Es muss timezone.utcexplizit 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():
Es gibt keine Methode, um den Zeitstempel von einer datetime-Instanz abzurufen, aber der POSIX-Zeitstempel, der einer datetime-Instanz dt entspricht, kann wie folgt einfach berechnet werden. Für einen naiven dt:
timestamp = (dt - datetime(1970, 1, 1)) / timedelta(seconds=1)
Und für einen bewussten dt:
timestamp = (dt - datetime(1970,1,1, tzinfo=timezone.utc)) / timedelta(seconds=1)
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:
timestamp = (dt - datetime(1970, 1, 1)).total_seconds()
Dabei timedelta.total_seconds()entspricht dies der (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6Berechnung mit aktivierter wahrer Division.
from __future__ import division
from datetime import datetime, timedelta
def totimestamp(dt, epoch=datetime(1970,1,1)):
td = dt - epoch
# return td.total_seconds()
return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6
now = datetime.utcnow()
print now
print totimestamp(now)
Vorsicht vor Gleitkomma-Problemen .
Ausgabe
2012-01-08 15:34:10.022403
1326036850.02
So konvertieren Sie ein bewusstes datetimeObjekt in einen POSIX-Zeitstempel
assert dt.tzinfo is not None and dt.utcoffset() is not None
timestamp = dt.timestamp() # Python 3.3+
Auf Python 3:
from datetime import datetime, timedelta, timezone
epoch = datetime(1970, 1, 1, tzinfo=timezone.utc)
timestamp = (dt - epoch) / timedelta(seconds=1)
integer_timestamp = (dt - epoch) // timedelta(seconds=1)
Auf Python 2:
# utc time = local time - utc offset
utc_naive = dt.replace(tzinfo=None) - dt.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()