Python | mktime溢出错误

时间:2010-03-25 19:26:53

标签: python

我一直在网上搜索,找不到适合这个问题的解决方案

OverflowError: mktime argument out of range

导致此异常的代码

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

我想知道这个例外的实际原因,有人说日期不在有效范围内,但它对我没有任何意义,如果有一个范围可能是什么。这取决于我们使用的系统。也想知道这个问题的一个很好的解决方案。

感谢。

2 个答案:

答案 0 :(得分:19)

time.mktime从平台的C库中调用基础mktime函数。例如,您发布的上述代码在Mac OS X上对我来说非常有效,尽管它返回负数,因为日期早于Unix纪元。所以原因是你的平台的mktime实现可能不支持Unix纪元之前的日期。您可以使用Python的datetime模块构造对应于上述日期的datetime对象,从代表Unix纪元的另一个datetime对象中减去它并使用计算出的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 :(得分:0)

python 时间模块

  

尽管此模块始终可用,但并非所有功能都可用   适用于所有平台。在此定义的大多数功能   具有相同名称的模块调用平台C库函数。它可能   有时有助于查阅平台文档,因为   这些功能的语义因平台而异。

     

时代是时间的起点,是平台   依赖。对于Unix,纪元是1970年1月1日,00:00:00(UTC)。至   找出给定平台上的时代,看看   time.gmtime(0)。

https://docs.python.org/3/library/time.html

Windows 10:

>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

>>> list((ix for ix in time.gmtime(0)))
[1970, 1, 1, 0, 0, 0, 3, 1, 0]

>>> time.mktime(time.gmtime(0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: mktime argument out of range

Windows 10上的C库函数不支持低于特定值的时间。