【问题标题】:Python | mktime overflow error蟒蛇 | mktime 溢出错误
【发布时间】:2010-03-25 19:26:53
【问题描述】:

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

OverflowError: mktime argument out of range

导致此异常的代码

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

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

谢谢。

【问题讨论】:

    标签: python


    【解决方案1】:

    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 评论中所述。

    【讨论】:

    • 打印 diff.total_seconds()
    • 谢谢,我已经更新了我的答案。 Python 2.5 和 2.6 在 2010 年更为流行,当时我添加了这个答案,total_seconds() 从 2.7 开始可用。
    【解决方案2】:

    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 库函数不支持低于某个值的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2018-08-24
      • 2016-10-17
      • 2017-02-24
      相关资源
      最近更新 更多