time.mktime不接受1900年前的年份吗?
在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开始算起的秒数)。所以在这个时间之前的日期会用负数来表示。