【问题标题】:What happened on March 16th 1984?1984 年 3 月 16 日发生了什么?
【发布时间】:2013-09-23 02:29:39
【问题描述】:

我试图弄清楚 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
>>>> 

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

虽然这个问题每次都在这个虚拟机上发生,但我无法让它在任何其他虚拟机上发生。

【问题讨论】:

  • 奇怪。在我的机器上没有问题(Mac OS,Python 2.7)。
  • 我认为可能是闰秒,但在 1984 年(任何日期)都没有添加,请参阅 en.wikipedia.org/wiki/Leap_second 。我怀疑您的 Python 版本中存在错误...
  • 没有什么要补充的,除了我也没有问题。很奇怪。
  • @ShashankGupta :确实归结为系统问题。 “date -d 03/16/1984”返回“无效日期。不过还是很奇怪。
  • 你的时区是什么?

标签: python timezone pypy mktime


【解决方案1】:

啊哈!谜团解决了(因为 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)) 不会。

【讨论】:

  • 因此,在 3 月 15 日至 16 日的晚上从来没有午夜(本来应该是午夜的时间立即变成了凌晨 1 点),这就是为什么无法构建特定时间的原因。
  • 你知道,如果这个问题从一开始就被标记为 timezone(尤其是如果它没有 python 标记,可能),那么 Jon Skeet 就会完蛋了.在此处查看看似神奇的答案:stackoverflow.com/questions/6841333/…
【解决方案2】:

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

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

【讨论】:

  • 更改时区(错误地设置为卡萨布兰卡)解决了这个问题……或者翻译到另一个未知的日期,谁知道呢!
  • 哇,有人非常关心实际检查结果并一些事情!好的!仅此一项就值得我投赞成票,即使它并不是真正解决 OP 问题的方法。希望它至少会提供一些线索,最终会导致真正的答案。本着这种精神,我想建议 OP 尝试缩小时间范围。是 1984-03-16 的全部时间都搞砸了,还是某个特定的时间?夏令时是一个不错的猜测,但非常奇怪(按照美国标准),因为那个日期是星期五,而我们的 DST 总是在星期日开始/结束。
  • 啊,当我输入我的评论时,OP 发布了一个解决方案(尽管不能完全解开谜团)。我想@falsetru 也值得称赞,因为他确实询问了时区。
猜你喜欢
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 2011-01-27
  • 2020-10-20
  • 2020-05-21
相关资源
最近更新 更多