2011-12-14 103 views
4

考慮下面的代碼:是否有可能通過Python的mktime進行往返以超出範圍?

value = time.mktime(datetime.fromtimestamp(timestamp).timetuple()) 

是否有可能爲這如果是這樣產生OverflowError「mktime參數超出範圍」和,什麼範圍的時間戳會導致此?

+0

不知道爲什麼這被拒絕;我意識到它有一點特定,但我正在問一個關於Python的行爲/限制的真正問題,這個問題沒有被文檔涵蓋。 – DNS 2011-12-14 03:48:24

回答

3

是的。我在UTC和Windows上提前兩個小時。我得到在int32範圍的最後兩個小時的錯誤:

>>> def roundtrip(x): 
...  return time.mktime(datetime.datetime.fromtimestamp(x).timetuple()) 
... 
>>> roundtrip(2**31-1-7200) 
2147476447.0 
>>> roundtrip(2**31-7200) 
OverflowError: mktime argument out of range 
>>> roundtrip(2**31-1) 
OverflowError: mktime argument out of range 
>>> roundtrip(2**31) 
ValueError: timestamp out of range for platform time_t 
1

注意:您提問的方式,我想沒有可能的時間戳會觸發您正在尋找的特定異常,因爲datetime.fromtimestamp會引發一個ValueError而不是,因爲它被綁定(可能)相同限制。

現在,mktime的範圍是平臺相關的,所以我不能給你一個明確的答案。在我的Linux 32位計算機中,邊界位於帶符號的32位整數內,所以一個轉換爲小於-2147483648(即在(1901, 12, 13, 19, 44, 16)之前)或過去2147483647或(2038, 1, 19, 3, 14, 7)的元組將觸發該異常......但是,對於您,datetime.fromtimestamp會早點收到。