考慮下面的代碼:是否有可能通過Python的mktime進行往返以超出範圍?
value = time.mktime(datetime.fromtimestamp(timestamp).timetuple())
是否有可能爲這如果是這樣產生OverflowError「mktime參數超出範圍」和,什麼範圍的時間戳會導致此?
考慮下面的代碼:是否有可能通過Python的mktime進行往返以超出範圍?
value = time.mktime(datetime.fromtimestamp(timestamp).timetuple())
是否有可能爲這如果是這樣產生OverflowError「mktime參數超出範圍」和,什麼範圍的時間戳會導致此?
是的。我在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
注意:您提問的方式,我想沒有可能的時間戳會觸發您正在尋找的特定異常,因爲datetime.fromtimestamp
會引發一個ValueError
而不是,因爲它被綁定(可能)相同限制。
現在,mktime
的範圍是平臺相關的,所以我不能給你一個明確的答案。在我的Linux 32位計算機中,邊界位於帶符號的32位整數內,所以一個轉換爲小於-2147483648(即在(1901, 12, 13, 19, 44, 16)
之前)或過去2147483647或(2038, 1, 19, 3, 14, 7)
的元組將觸發該異常......但是,對於您,datetime.fromtimestamp
會早點收到。
不知道爲什麼這被拒絕;我意識到它有一點特定,但我正在問一個關於Python的行爲/限制的真正問題,這個問題沒有被文檔涵蓋。 – DNS 2011-12-14 03:48:24