2013-09-23 3 views
11

Я пытаюсь выяснить, что особенного о 16 марта 1984. На виртуальной машине, которую я использую (ничего особенного), Python (а также PyPy) падает при попытке использовать mktime с тем, что кажется совершенно разумная структура времени.Что произошло 16 марта 1984 года?

$ 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 
>>>> 

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

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

+0

Странно. Не создает проблем на моей машине (Mac OS, Python 2.7). – Floris

+1

Я думал, что это может быть скачок секунд, но ни один не был добавлен в 1984 году (в любую дату) см. Http://en.wikipedia.org/wiki/Leap_second. Я подозреваю, что ошибка в вашей версии Python ... – Floris

+1

Ничего добавить кроме этого у меня тоже нет. Очень странно. – verbsintransit

ответ

7

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

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 года», что Casablanca изменила свое время в 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)) не будет.

+0

Итак, в ночь с 15 на 16 марта не было полночь (то, что было полночь, мгновенно стало 1 утра), и поэтому это конкретное время не может быть построено. –

+2

Знаешь, если бы этот вопрос был отмечен «часовым поясом» с самого начала (и, особенно, если у него не было тега 'python', возможно), тогда Джон Скит был бы таким. См. Чудо-кажущийся ответ здесь: http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in1927-giving-a-strange-result –

7

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

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

+0

Изменение часового пояса (которое было неправильно установлено в Касабланке) решило проблему ... или переведено на другую неизвестную дату, ows! –

+0

Ничего себе, кто-то достаточно заботился, чтобы проверить результаты и * сделать что-то с ними! Ницца! Это само по себе стоит того, чтобы выжить от меня, хотя это не является решением проблемы OP.Надеюсь, он, по крайней мере, даст некоторое представление, которое в конечном итоге приведет к реальному ответу. В этом духе я хотел бы предложить OP попытаться сузить сроки. Является ли весь 1984-03-16 запутанным, или это конкретный час? Летнее время - это хорошая догадка, но невероятно странная (по стандартам США), потому что эта дата была пятницей, и наш DST всегда начинается/заканчивается в воскресенье. –

+1

Ах, ОП опубликовал резолюцию (хотя и не совсем решая тайну), когда я печатал свой комментарий. Наверное, я тоже люблю @falsetru, так как он спрашивал о часовом поясе. –