1984年3月16日发生的事情



我试图弄清楚1984年3月16日有什么特别之处。在我正在使用的虚拟机上(没有什么特别的),Python(以及 PyPy)在尝试使用 mktime 时崩溃,这似乎是一个完全合理的时间结构。

$ pypy
Python 2.7.3 (f66246c46ca30b26a5c73e4cc95dd6235c966b8f, Jul 30 2013, 09:27:06)
[PyPy 2.0.2 with GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>> import time
>>>> time.mktime((1984,3,16,0,0,0,0,0,0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: mktime argument out of range
>>>> time.mktime((1984,3,15,0,0,0,0,0,0))
448156800.0
>>>> time.mktime((1984,3,17,0,0,0,0,0,0))
448326000.0
>>>> time.mktime((1984,3,16,0,0,0,0,0,0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: mktime argument out of range
>>>> 

为什么以及可以做些什么来避免这个问题?

尽管每次在此 VM 上都会发生此问题,但我无法在任何其他 VM 上发生此问题。

啊哈!谜团解开了(因为OP终于找出了时区"有问题")。我发现这个:

http://www.timeanddate.com/worldclock/timezone.html?n=60&syear=1980

1980    No time changes  
1981    No time changes  
1982    No time changes  
1983    No time changes  
1984    Time zone change on Friday, March 16, 1984 at 1:00:00 AM     
1985    Time zone change on Tuesday, December 31, 1985 at 11:00:00 PM    
1986    No time changes  
1987    No time changes  
1988    No time changes  
1989    No time changes  

所以,我想"1984 年 3 月 16 日发生的事情"的答案是卡萨布兰卡当天凌晨 1:00 改变了时间。 :)

技术上讲,它立即从午夜跳到凌晨 1:00,因此可能从 00:00 开始和 01:00 之前的所有时间都会产生相同的错误。也就是说,我的猜测是time.mktime((1984,3,16,1,0,0,0,0,0))和更大的会起作用,但例如,time.mktime((1984,3,16,0,59,0,0,0,0))不会。

您的机器认为在 1984 年 3 月 15 日午夜和 1984 年 3 月 17 日午夜之间存在夏令时转换,因为 448326000.0 和 448156800.0 之间的差异是 47 小时,而不是 48 小时。

但据我所知,那天在法国没有发生这样的转变。而且我不确定您如何修复操作系统对历史夏令时转换的解释。

相关内容

  • 没有找到相关文章

最新更新