time.mktime不接受1900年前的年份吗?

1 投票
2 回答
983 浏览
提问于 2025-04-18 11:34

在Python 2.7中,time.mktime这个函数不接受1900年之前的年份,这听起来有点奇怪。

>>> time.mktime(time.strptime("1/1/1899","%d/%m/%Y"))
Traceback (most recent call last):
  File "<pyshell#293>", line 1, in <module>
    time.mktime(time.strptime("1/1/1899","%d/%m/%Y"))
ValueError: year out of range

不过,calendar.timegm这个函数可以处理所有年份。

>>> calendar.timegm(time.strptime("1/1/1899","%d/%m/%Y"))
-2240524800

>>> calendar.timegm(time.strptime("1/1/0001","%d/%m/%Y"))
-62135596800

这是正常的行为吗?我觉得这有点奇怪。看起来就算是-71年也不应该让双精度数值溢出。

2 个回答

2

你遇到的问题和平台特定的时间实现有关,这个实现是 time.mktime 所依赖的:

它能生成的最早日期是依赖于你使用的平台的。

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

calendar.timegm 是一个完全不同的实现,它使用时间元组来操作。这个元组包含了整年的信息,所以它可以很轻松地表示1900年之前的日期。

https://docs.python.org/2/library/time.html#time.struct_time

4

这是正常的行为。

  • 第一个问题在Python 2.7 的文档中有说明,特别是关于2000年(Y2K)的问题。文档中提到:

    值在100到1899之间的日期总是无效的。

    而Python 3支持这些日期,所以没有这样的限制(文档)。

  • 第二个关于负日期的问题也是正常的。这些日期是以自纪元以来的秒数来表示的(也就是从1970年1月1日00:00:00 UTC开始算起的秒数)。所以在这个时间之前的日期会用负数来表示。

撰写回答