2010-06-02 12 views
47

Parece que me cuesta trabajo entender esto.Python - calendar.timegm() vs. time.mktime()

¿Cuál es la diferencia entre calendar.timegm() y time.mktime()?

Supongo que tengo un datetime.datetime sin tzinfo conectado, ¿no deberían los dos dar el mismo resultado? ¿No dan ambos el número de segundos entre epoch y la fecha pasada como parámetro? Y dado que la fecha no tiene tzinfo, ¿no es el mismo número de segundos?

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

Consulte esta pregunta: http://stackoverflow.com/questions/15447632/python-convert-utc-time-tuple-to-utc-timestamp – treecoder

Respuesta

78

time.mktime() asume que la tupla aprobada está en la hora local, calendar.timegm() supone que está en GMT/UTC. Dependiendo de la interpretación, la tupla representa un tiempo diferente, por lo que las funciones devuelven valores diferentes (segundos desde que la época está basada en UTC).

La diferencia entre los valores debe ser igual al desplazamiento de la zona horaria de su zona horaria local.

+0

Oh, ya veo, básicamente timegm asume que pasé UTC y simplemente hace la diferencia entre lo que pasé y 1970.01.01 UTC, mientras que mktime primero convierte lo que pasé a UTC al agregar mi compensación de zona horaria y hace qué ¿Timegm lo hizo a partir de ahí? – ibz

+0

Pero, ¿POR QUÉ si tzinfo de mi fecha y hora es None, hace mktime CUALQUIER conversión? ¿No debería dejarlo como está? ¿Por qué supondría que está en la zona horaria local? – ibz

+2

@ibz: El parámetro 'timetuple' dado a' mktime() 'no contiene ninguna información de zona horaria (nunca lo hace, no hay un campo de zona horaria en' timetuple'). Por lo tanto, la función tiene que "adivinar" qué zona horaria podría ser, y 'mktime()' siempre asume que es hora local. Así es como se comporta la función. – sth

7

calendar.timegm conversos de marca de hora UTC, time.mktime converts from local time not UTC.

La diferencia de 8 horas en sus resultados corresponde exactamente a la zona horaria de su ubicación.

+2

Más precisamente, timegm interpreta la fecha dada como UTC, devolviendo una marca de tiempo, mientras que mktime interpreta la fecha dada como hora local y devuelve una marca de tiempo. –

+0

@Greg: corregido. leer mal los documentos :) – SilentGhost