在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年内溢出一倍。
答案 0 :(得分:4)
这是预期的行为。
第一个记录在Python 2.7 docs under Year 2000 (Y2K) issues中。它说明了
值100-1899始终是非法的。
Python 3支持这些日期,因此没有此类限制(docs)。
预计负日期的第二点也是如此。日期为seconds since the epoch(1970年1月1日00:00:00 UTC后的秒数)。因此,此前的日期将存储为负数。
答案 1 :(得分: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