Летнее время в Javascript для 1974 года?

«В годы «энергетического кризиса» Конгресс ввел более ранние даты начала дневного времени. В 1974 году летнее время началось 6 января, а в 1975 году оно началось 23 февраля. После этих двух лет начальная дата вернулась к последнему воскресенью в Апрель."
(через http://aa.usno.navy.mil/faq/docs/daylight_time.php )

Похоже, что в объекте даты Javascript для этих дат есть ошибка. Если вы конвертируете 127627200000 миллисекунд в дату, это должно быть четверг, 17 января, 00:00:00 по восточному поясному времени 1974 года. Это правильно на http://www.fileformat.info/tip/java/date2millis.htm, но неверно на http://www.esqsoft.com/javascript_examples/date-to-epoch.htm, в котором говорится, что он преобразуется в среду, 16 января 1974 г., 23:00:00. GMT-0500 (восточное поясное время). Если вы создаете новый объект Date(127627200000) в javascript, он дает последнее преобразование даты. Это происходит во всех основных браузерах.

Я не могу представить, что это первый раз, когда это стало проблемой для кого-либо, но я не могу найти других случаев этой проблемы с помощью нескольких поисков в Интернете. Кто-нибудь знает, существует ли исправление для этого или более простое исправление, чем ручная проверка дат, когда Javascript имеет неправильное преобразование? Есть ли другие даты, это проблема?


person jeffl8n    schedule 19.01.2010    source источник
comment
Ах!! Радости глобализации... Учитывали ли вы, что хотя в 1974 году в США могло быть летнее время, в других странах его могло и не быть? И что для максимально широкого использования (не говоря уже об упрощении процесса разработки) в JavaScript может не быть таблицы для всех доступных переходов на летнее время во всех возможных странах?   -  person Paulo Santos    schedule 19.01.2010


Ответы (2)


Как всегда, лучше проверить спецификацию :)

В данном случае я был очень удивлен, увидев это в разделе 15.9.1.9 ECMA-262:

Реализация ECMAScript не должна пытаться определить, зависело ли точное время от перехода на летнее время, а только действовало бы летнее время, если бы в это время использовался текущий алгоритм перехода на летнее время. Это позволяет избежать осложнений, таких как учет лет, в течение которых в данном регионе соблюдается переход на летнее время круглый год.

Другими словами, реализация, соответствующая стандарту ECMAScript, не может быть исторически точной.

Теперь, следуют ли все реализации этому или нет, я не уверен... но это предполагает, что вам понадобится какая-то отдельная библиотека, если вы хотите получить исторически точные часовые пояса... где "исторически точные" не должны быть почти в 1974 году, конечно: США изменили свой график перехода на летнее время в 2007 году, а другие страны сделали это позже (и с меньшим предупреждением).


1 Первое вхождение 15.9.1.9. По какой-то причине это происходит дважды - один раз для «Перехода на летнее время» и один раз для «Местного времени». Вот это да.

person Jon Skeet    schedule 19.01.2010
comment
Исторические часовые пояса Java удивили немало людей (особенно когда они были добавлены в версии 1.4). Особое удивление вызывает смещение +1 час для Лондона в 1970-01-01 и смещение на доли секунды для Греции, Хельсинки в начале 1920-х годов. - person Mark Thornton; 19.01.2010
comment
Дробные секунды смещения действительно звучат как плохие новости. Я думаю, я бы даже сказал, что так мало приложений действительно захотят такого поведения, возможно, было бы лучше оставить его, например дополнительные секунды... - person Jon Skeet; 19.01.2010

Java делает исторические часовые пояса (примерно до 1920 года), JavaScript, по-видимому, нет.

person Mark Thornton    schedule 19.01.2010