Что случилось 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
>>>> 

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

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


person Benoît    schedule 23.09.2013    source источник
comment
Странный. Не вызывает проблем на моей машине (Mac OS, Python 2.7).   -  person Floris    schedule 23.09.2013
comment
Я подумал, что это могут быть дополнительные секунды, но в 1984 году (по любой дате) не было добавлено ни одного, см. en.wikipedia. org / wiki / Leap_second. Я подозреваю ошибку в вашей версии Python ...   -  person Floris    schedule 23.09.2013
comment
Нечего добавить, кроме этого, у меня тоже нет проблем. Очень странно.   -  person verbsintransit    schedule 23.09.2013
comment
Это был исключительно обычный день ;-)   -  person Tim Peters    schedule 23.09.2013
comment
stackoverflow.com/questions/2518706/   -  person Shashank    schedule 23.09.2013
comment
Есть ли другие даты, когда возникает ошибка?   -  person flornquake    schedule 23.09.2013
comment
Точно не могу сказать. Моя программа имеет дело с несколькими датами, и это единственная, для которой это произошло.   -  person Benoît    schedule 23.09.2013
comment
@ShashankGupta: действительно, все сводится к системной проблеме. date -d 16.03.1984 возвращает недопустимую дату. Хотя все еще странно.   -  person Benoît    schedule 23.09.2013
comment
Какой у вас часовой пояс?   -  person falsetru    schedule 23.09.2013
comment
@falsetru: $ date - ›lun. сен. 23 03:58:07 ЗАПАД 2013 так ЗАПАД :)   -  person Benoît    schedule 23.09.2013
comment
Я думаю, что из вашего собственного тестирования и комментариев других людей довольно ясно, что рассматриваемая виртуальная машина (гораздо больше, чем CPython или PyPy) заслуживает исследования на предмет ошибок.   -  person John Y    schedule 23.09.2013
comment
Что касается вопроса, что можно сделать, чтобы избежать этой проблемы? ответ также предельно ясен: не используйте эту конкретную виртуальную машину!   -  person John Y    schedule 23.09.2013
comment
@JohnY: Думаю, ты прав, но я понятия не имею, с чего начать расследование!   -  person Benoît    schedule 23.09.2013
comment
Что ж, одним из первых шагов было бы сообщить людям, какую виртуальную машину вы используете, и соответствующим образом настроить теги этого вопроса. Будьте как можно более конкретными. Когда вы говорите, что в этом нет ничего особенного, мы все знаем, что это неверно. Ясно, что в этой виртуальной машине есть что-то особенное и неправильное.   -  person John Y    schedule 23.09.2013


Ответы (2)


Ага! Тайна разгадана (так как 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  

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

person John Y    schedule 23.09.2013
comment
Итак, в ночь с 15 на 16 марта никогда не было полуночи (то, что было бы полуночью, мгновенно превратилось в 1 час ночи), и поэтому это конкретное время не может быть построено. - person Damien_The_Unbeliever; 23.09.2013
comment
Знаете, если бы этот вопрос был помечен тегом timezone с самого начала (и особенно, если бы он, вероятно, не имел тега python), то Джон Скит был бы во всем этом. См. Чудесный ответ здесь: stackoverflow.com/questions/6841333/ - person John Y; 23.09.2013

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

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

person Damien_The_Unbeliever    schedule 23.09.2013
comment
Изменение часового пояса (которое было ошибочно установлено на Касабланку) решило проблему ... или переведено на другую неизвестную дату, кто знает! - person Benoît; 23.09.2013
comment
Вау, кто-то достаточно позаботился о том, чтобы проверить результаты и сделать что-нибудь с ними! Отлично! Это само по себе заслуживает моего одобрения, хотя на самом деле это не решение проблемы OP. Надеюсь, это даст хоть какую-то подсказку, которая в конечном итоге приведет к настоящему ответу. В этом духе я хотел бы предложить OP попытаться сузить временные рамки. Все 1984-03-16 испорчено, или это конкретный час? Переход на летнее время - хорошая догадка, но невероятно странная (по стандартам США), потому что эта дата была пятницей, а летнее время всегда начинается / заканчивается в воскресенье. - person John Y; 23.09.2013
comment
Ах, OP опубликовал резолюцию (хотя и не совсем разгадывал загадку), пока я печатал свой комментарий. Думаю, похвала и @falsetru, так как он спросил о часовом поясе. - person John Y; 23.09.2013