2010-03-25 124 views
15

我一直在尋找所有過網,找不到此問題Python | mktime溢出錯誤

OverflowError: mktime argument out of range 

導致該異常

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

我想知道的代碼合適的解決方案這種例外的實際原因,有人說日期不在有效範圍內,但對我來說沒有任何意義,如果有一個範圍,它可能是什麼。這取決於我們正在使用的系統嗎?也想知道這個問題的一個很好的解決方案。

謝謝。

回答

19

time.mktime從平臺的C庫調用底層的mktime函數。例如,你發佈的上述代碼在Mac OS X上對我來說工作得非常好,但它會返回一個負數,因爲日期在Unix時代之前。所以原因是你的平臺的mktime實現可能不支持Unix時代之前的日期。您可以使用Python的datetime模塊來構建對應於上述日期datetime對象,從另一個datetime對象,表示Unix紀元減去它並使用計算timedelta對象來獲取,因爲時代的秒數:

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

更新:如果您使用Python 2.7或更高版本,則可以簡單地使用print diff.total_seconds(),如下面Chad Miller的評論中所述。

+1

print diff.total_seconds() – 2015-09-22 10:44:07

+0

謝謝,我已經更新了我的答案。 Python 2.5和2.6在2010年更加流行,我添加了這個答案,'total_seconds()'從2.7開始可用。 – 2015-09-22 14:50:11