Что произошло 16 марта 1984 года?

Я пытаюсь выяснить, что особенное о 16 марта 1984 года. На виртуальной машине я использую (ничего особенного), 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
>>>> 

Почему и что можно сделать, чтобы избежать этой проблемы?

Несмотря на то, что проблема возникает каждый раз на этой виртуальной машине, я не мог заставить ее встречаться ни на одном другом.

Ответ 1

Ага! Тайна решена (поскольку ОП окончательно определил часовой пояс "по вине" ). Я нашел это:

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  

Итак, я думаю, ответ на вопрос "Что случилось 16 марта 1984 года" заключается в том, что Касабланка изменил свое время в 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)) не будет.

Ответ 2

Ваша машина думает, что с полуночи 15 марта 1984 года и полуночи 17 марта 1984 года произошел переход на летнее время, учитывая, что разница между 448326000,0 и 448156800,0 составляет 47 часов, а не 48.

Но насколько я могу судить, в этот день во Франции такого перехода не произошло. И я не уверен, как вы исправите свою интерпретацию ОС исторических переходов на летнее время.