我一直在网上搜索,找不到适合这个问题的解决方案
OverflowError: mktime argument out of range
导致此异常的代码
t = (1956, 3, 2, 0, 0, 0, 0, 0, 0)
ser = time.mktime(t)
我想知道这个例外的实际原因,有人说日期不在有效范围内,但它对我没有任何意义,如果有一个范围可能是什么。这取决于我们使用的系统。也想知道这个问题的一个很好的解决方案。
感谢。
答案 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库函数不支持低于特定值的时间。