2010-03-25 30 views
15

he estado de búsqueda por toda la red y no podía encontrar una solución adecuada para este problemaPython | Error de desbordamiento mktime

OverflowError: mktime argument out of range 

El código que hace que esta excepción

t = (1956, 3, 2, 0, 0, 0, 0, 0, 0) 
ser = time.mktime(t) 

Me gustaría saber el el motivo real de esta excepción, algunos dicen que la fecha no está dentro de un rango válido pero no tiene ningún sentido para mí, y si hay un rango, podría ser. ¿Depende del sistema que estamos usando? También me gustaría saber una buena solución para este problema.

Gracias.

Respuesta

19

time.mktime llama a la función subyacente mktime de la biblioteca C de la plataforma. Por ejemplo, el código anterior que publicó funciona perfectamente para mí en Mac OS X, aunque devuelve un número negativo ya que la fecha es anterior a la época de Unix. Por lo tanto, la razón es que la implementación de su plataforma mktime probablemente no admite fechas anteriores a la época de Unix. Puede utilizar el módulo de Python datetime para construir un objeto datetime correspondiente a la fecha arriba indicada, restarlo de otra datetime objeto que representa la época Unix y utilizar la timedelta objeto calculada para obtener el número de segundos desde la época:

from datetime import datetime 
epoch = datetime(1970, 1, 1) 
t = datetime(1956, 3, 2) 
diff = t-epoch 
print diff.days * 24 * 3600 + diff.seconds 

Actualización: si está utilizando Python 2.7 o superior, simplemente podría usar print diff.total_seconds() como se indica a continuación en el comentario de Chad Miller.

+1

print diff.total_seconds() –

+0

Gracias, he actualizado mi respuesta. Python 2.5 y 2.6 fueron mucho más frecuentes en 2010 cuando agregué esta respuesta y 'total_seconds()' está disponible desde 2.7 en adelante. –

Cuestiones relacionadas