是否有可能通过Python的mktime往返以“超出范围”失败?

时间:2011-12-14 03:13:53

标签: python datetime time

给出以下代码:

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

是否有可能产生OverflowError'mktime参数超出范围',如果是,那么什么范围的时间戳会导致这种情况?

2 个答案:

答案 0 :(得分: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 :(得分:1)

注意:你问的方式,我想没有可能的时间戳会触发你正在寻找的特定异常,因为datetime.fromtimestamp会引发ValueError,因为它是(可能)受到相同的限制。

现在,mktime的范围取决于平台,因此我无法给出明确的答案。在我的Linux 32位计算机中,边界在带符号的32位整数内,因此转换为小于-2147483648(即在(1901, 12, 13, 19, 44, 16)之前)或过去2147483647或(2038, 1, 19, 3, 14, 7)的元组将触发该异常......但是,对你来说,datetime.fromtimestamp会更早地抓住它。