2010-03-25 3 views
15

J'ai été la recherche sur le net et n'a pas pu trouver une solution appropriée à ce problèmePython | erreur de débordement mktime

OverflowError: mktime argument out of range 

Le code qui provoque cette exception

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

Je voudrais savoir la raison réelle de cette exception, certains disent que la date n'est pas dans une fourchette valide, mais cela n'a aucun sens pour moi, et s'il y a une gamme de ce que cela pourrait être. Cela dépend-il du système que nous utilisons? Aussi voudrais savoir une bonne solution pour ce problème.

Merci.

Répondre

19

time.mktime appelle la fonction mktime sous-jacente à partir de la bibliothèque C de la plateforme. Par exemple, le code ci-dessus que vous avez posté fonctionne parfaitement bien sur Mac OS X, bien qu'il renvoie un nombre négatif car la date est antérieure à l'époque Unix. La raison en est que l'implémentation mktime de votre plateforme ne prend probablement pas en charge les dates antérieures à l'époque Unix. Vous pouvez utiliser le module datetime de Python pour construire un objet datetime correspondant à la date ci-dessus, soustraire d'un autre objet datetime qui représente l'époque Unix et utiliser la valeur calculée timedelta objet pour obtenir le nombre de secondes écoulées depuis l'époque:

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

Mise à jour: si vous utilisez Python 2.7 ou supérieur, vous pouvez simplement utiliser print diff.total_seconds() comme indiqué ci-dessous dans le commentaire de Chad Miller.

+1

print diff.total_seconds() –

+0

Merci, j'ai mis à jour ma réponse. Python 2.5 et 2.6 étaient beaucoup plus répandus en 2010 lorsque j'ai ajouté cette réponse et 'total_seconds()' est disponible à partir de la version 2.7. –