Konvertieren eines Unixtimes in ein datetime-Objekt und wieder zurück (Paar Zeitumwandlungsfunktionen, die invers sind)

Ich versuche, ein Paar von Funktionen, dt und ut zu schreiben, die zwischen normaler Unix-Zeit (Sekunden seit 1970-01-01 00:00:00 UTC) und einem Pythondatetime-Objekt hin und her konvertieren.

Wenn dt und ut korrekte inverses waren, würde dieser Code den gleichen Zeitstempel zweimal drucken:

 import time, datetime # Convert a unix time u to a datetime object d, and vice versa def dt(u): return datetime.datetime.fromtimestamp(u) def ut(d): return time.mktime(d.timetuple()) u = 1004260000 print u, "-->", ut(dt(u)) 

Ach, der zweite Zeitstempel ist 3600 Sekunden (eine Stunde) weniger als der erste. Ich denke, das passiert nur für ganz besondere Unzeiten, vielleicht während dieser Stunde, dass die Sommerzeit überspringt. Aber gibt es einen Weg, um dt und ut zu schreiben, also sind sie wahre Inversen von einander?

Zugehörige Frage: Making matplotlib's date2num und num2date perfekt inverses

One Solution collect form web for “Konvertieren eines Unixtimes in ein datetime-Objekt und wieder zurück (Paar Zeitumwandlungsfunktionen, die invers sind)”

Sie sind richtig, dass dieses Verhalten mit der Sommerzeit zusammenhängt. Der einfachste Weg, dies zu vermeiden ist, um sicherzustellen, dass Sie eine Zeitzone ohne Sommerzeit nutzen, UTC macht hier am meisten Sinn

datetime.datetime.utcfromtimestamp() und calendar.timegm() befassen sich mit UTC-Zeiten und sind exakte inverses.

 import calendar, datetime # Convert a unix time u to a datetime object d, and vice versa def dt(u): return datetime.datetime.utcfromtimestamp(u) def ut(d): return calendar.timegm(d.timetuple()) 

Hier ist ein bisschen Erklärung hinter warum datetime.datetime.fromtimestamp() hat ein Problem mit Sommerzeit, aus den docs:

Geben Sie das lokale Datum und die Uhrzeit entsprechend dem POSIX-Zeitstempel zurück, wie z. B. von time.time() . Wenn das optionale Argument tz nicht oder nicht angegeben ist, wird der Zeitstempel in das lokale Datum und die Uhrzeit der Plattform konvertiert und das zurückgegebene datetime-Objekt ist naiv.

Der wichtige Teil hier ist, dass man ein naives datetime.datetime Objekt datetime.datetime , was bedeutet, dass es keine Zeitzone (oder Sommerzeit) Informationen als Teil des Objekts gibt. Dies bedeutet, dass mehrere verschiedene Zeitstempel auf das gleiche datetime.datetime Objekt fromtimestamp() , wenn Sie fromtimestamp() , wenn Sie zufällig Zeit auswählen, die während der Sommerzeit zurückfallen,

 >>> datetime.datetime.fromtimestamp(1004260000) datetime.datetime(2001, 10, 28, 1, 6, 40) >>> datetime.datetime.fromtimestamp(1004256400) datetime.datetime(2001, 10, 28, 1, 6, 40) 
  • Zeigen Sie eine Reihe von Daten auf der Grundlage des aktuellen Datums, in Python
  • Python: Anzeige verstrichene Zeit auf Shell
  • Wie endet das Programm nach vorgegebener Zeit in Python
  • In python, wie zu überprüfen, ob ein Datum gültig ist?
  • Wie bekomme ich Min, Sekunden und Millisekunden von datetime.now () in Python?
  • Resample Time Series Daten mit Javascript und Mongodb
  • Google App Engine Datenspeicher datetime in Python?
  • Dateiverarbeitung und Erstellung
  • Von: "Vor 1 Stunde", Zu: Timedelta + Genauigkeit
  • Planen Sie Zeit und Datum, um Skript auszuführen
  • Wie gewartet man etwas Zeit im Pygame?
  • Python ist die beste Programmiersprache der Welt.