2010-03-25 12 views
15

sono stato ricerca per tutta la rete e non riusciva a trovare una soluzione adeguata a questo problemaPython | mktime errore di overflow

OverflowError: mktime argument out of range 

Il codice che causa questa eccezione

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

vorrei sapere il motivo effettivo di questa eccezione, alcuni dicono che la data non è in un intervallo valido ma non ha alcun senso per me, e se c'è un intervallo che potrebbe essere. Dipende dal sistema che stiamo usando. Vorrebbe anche sapere una buona soluzione per questo problema.

Grazie.

risposta

19

time.mktime chiama la funzione sottostante mktime dalla libreria C della piattaforma. Ad esempio, il codice sopra che hai postato funziona perfettamente per me su Mac OS X, anche se restituisce un numero negativo poiché la data è precedente all'epoca Unix. Quindi, la ragione è che l'implementazione della tua piattaforma mktime probabilmente non supporta le date prima dell'epoca Unix. È possibile utilizzare moduli di Python datetime creare un oggetto datetime corrispondente alla data sopra, sottrarre da un altro oggetto datetime che rappresenta l'epoca Unix e usare l'calcolata timedelta oggetto per ottenere il numero di secondi da epoch:

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

Aggiornamento: se si utilizza Python 2.7 o versioni successive, è possibile utilizzare semplicemente print diff.total_seconds() come indicato di seguito nel commento di Chad Miller.

+1

stampa diff.total_seconds() –

+0

Grazie, ho aggiornato la mia risposta. Python 2.5 e 2.6 erano molto più diffusi nel 2010 quando ho aggiunto questa risposta e 'total_seconds()' è disponibile dalla 2.7 in poi. –

Problemi correlati