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

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

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

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

Ответ 1

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

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

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

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

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


1 Первое вхождение в 15.9.1.9. По какой-то причине это происходит дважды - один раз для "Регулировка времени летнего времени" и один раз для "Местного времени". Ничего себе.

Ответ 2

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