2010-06-02 4 views
47

Es scheint mir schwer zu sein, meinen Kopf dazu zu bringen.Python - calendar.timegm() vs. time.mktime()

Was ist der Unterschied zwischen calendar.timegm() und time.mktime()?

Sage ich habe eine datetime.datetime ohne TZinfo beigefügt, sollten nicht die beiden die gleiche Ausgabe geben? Geben sie nicht die Anzahl der Sekunden zwischen der Epoche und dem Datum als Parameter an? Und da das vergangene Datum kein TZinfo hat, ist die Anzahl der Sekunden nicht gleich?

>>> import calendar 
>>> import time 
>>> import datetime 
>>> d = datetime.datetime(2010, 10, 10) 
>>> calendar.timegm(d.timetuple()) 
1286668800 
>>> time.mktime(d.timetuple()) 
1286640000.0 
>>> 
+1

Siehe diese Frage: http://StackOverflow.com/questions/15447632/python-convert-utc-time-tuple-to-utc-timestamp – treecoder

Antwort

78

time.mktime() wird davon ausgegangen, dass das übergebene Tupel in Ortszeit ist, calendar.timegm() nimmt an, dass es in GMT/UTC ist. Abhängig von der Interpretation repräsentiert das Tupel eine andere Zeit, so dass die Funktionen unterschiedliche Werte zurückgeben (Sekunden seit der Epoche sind UTC-basiert).

Der Unterschied zwischen den Werten sollte dem Zeitzonenoffset Ihrer lokalen Zeitzone entsprechen.

+0

Oh, ich sehe, also im Grunde nimmt timegm an, dass ich UTC übergeben habe und einfach den Unterschied zwischen dem, was ich übergeben habe, und 1970.01.01 UTC ändere, während mktime zuerst das, was ich an UTC übergeben habe, indem er meinen Zeitzonen-Offset hinzufügt Timegm tat von da an? – ibz

+0

Aber WARUM, wenn meine Datetime TZinfo ist None macht Mktime keine Konvertierung? Sollte es nicht so bleiben wie es ist? Warum sollte es annehmen, dass es in der lokalen Zeitzone ist? – ibz

+2

@ibz: Der 'tempuple' Parameter für' mktime() 'enthält keine Zeitzoneninformationen (dies ist nicht der Fall, es gibt kein Zeitzonenfeld in einem 'Stundenplan'). Daher muss die Funktion "raten", welche Zeitzone sie sein könnte, und "mktime()" nimmt immer an, dass es sich um die lokale Zeit handelt. So verhält sich die Funktion. – sth

7

calendar.timegm wandelt von UTC-Zeitstempel, time.mktime converts from local time not UTC.

8 Stunden Unterschied in ihren Ergebnissen entspricht genau der Zeitzone Ihres Standortes.

+2

Genauer gesagt interpretiert Timegm das angegebene Datum als UTC, Rückgabe eines Zeitstempels, während mktime das angegebene Datum als lokale Zeit interpretiert und einen Zeitstempel zurückgibt. –

+0

@Greg: korrigiert. Die Doks wurden falsch gelesen :) – SilentGhost