Зоны на JavaScript время неправильно в прошлом переходом на летнее время, правила перехода



В 2007 году дни, когда мы переходим на летнее время, изменились. Любая дата, которая попадает в расширенный диапазон DST до этого изменения, сообщает о неправильном смещении часового пояса в Chrome и Firefox. Это как Firefox и Chrome не обращают внимания на то, что у DST раньше были разные дни.



Если вы запустите следующий скрипт, он сообщит о смещении в 240 минут. Это неверно, он должен сообщить 300 минут. IE10 делает это правильно. Кто-нибудь знает об этом? исправить?



alert(new Date('11/04/2004').getTimezoneOffset());


Обновление:



Вот интересный фрагмент кода, который я только что взломал (см. ниже). Это действительно удивительно, как далеко от большинства дат находятся в каждом браузере, кроме IE. Сравните даты начала и окончания с этим: http://www.timeanddate.com/worldclock/timezone.html?n=77&syear=2000

В итоге я просто заменил прототип Date для getTimezoneOffset на свой собственный, который вычисляет его на основе жестко закодированной таблицы. Это работает для нас, потому что мы только делаем бизнес в США-это, пожалуй, худшее возможное решение,которое я могу себе представить...



<!DOCTYPE html>
<html>
<head>
<title>Moment Test</title>
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/2.0.0/moment.min.js"></script>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
var lastOffset = null;
var $tbody = null;
var endDate = new Date('01/01/2021');

function addDate(d) {
if($tbody === null)
$tbody = $('#dates');

var offset = d.getTimezoneOffset();
var s = '';
if(lastOffset != offset) {
if(lastOffset != null)
s = '<tr style="background-color: red;">';
lastOffset = offset;
}
else {
s = '<tr>';
}
var m = new moment(d);
s += '<td>' + m.format('YYYY-MM-DD') + '</td><td>' + m.format('YYYY-MM-DDTHH:mm:ssZ') + '</td><td>' + m.format('YYYY-MM-DDTHH:mm:ss') + '</td><td>' + offset + '</td></tr>';
$tbody.append($(s));
d.setDate(d.getDate() + 1);

if(d < endDate)
window.setTimeout(function(){addDate(d)}, 0);
}

</script>
</head>
<body>
<button onclick="addDate(new Date('01/01/1980'));">Fill Table</button>
<table border="1">
<thead><tr><th>Date</th><th>Date 2</th><th>Date 3</th><th>TZ Offset</th></tr></thead>
<tbody id='dates'></tbody>
</table>
</body>
</html>
714   2  

2 ответов:

Это фактически заданное поведение для использования текущих правил DST и игнорирования тех, которые действуют в конкретный момент времени. См. ES5 15.9.1.8:

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

Правила таковы: примените текущие правила DST к любому времени, которое было указано. Это приводит к совершенно бессмысленному поведению, но это то, что требуется ECMAScript.

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

Я подтвердил, что это истинная ошибка в JavaScript.

  • протестировано с общими часовыми поясами США, которые следуют за переходом на летнее время
      Восточная, Центральная, Горная, Тихоокеанская
  • протестировано в Chrome, Firefox, Safari и не удалось (последние версии)
  • Тестировался в IE 6, 7, 8, 9 и потерпел неудачу.
  • протестировано в IE 10 и прошло (не затронуто).
  • протестировано на Windows 7, 8 и Mac OSX.
  • Это довольно тревожно. Кто-нибудь знает корень причина?

    Я думал, что это может быть ошибка WebKit, но Firefox использует Gecko.

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

    Возможно, это основная ошибка JavaScript? Мне действительно трудно поверить, что что-то такое основное было упущено юнит-тестом.

    Я подумал, что, возможно, это просто влияет на системы Windows, из-за для ОС, имеющей часовые пояса Windows вместо TZDB,но это не так, поскольку это происходит и на Mac.

    Мы все знаем, что JavaScript-даты странные, но я подумал, что мы могли бы, по крайней мере, положиться на это. Вам даже не нужно смотреть на смещение или включать синтаксический анализ. Просто проверьте значение:

    new Date(2004,10,4)  // recall, js months are 0-11, so this is Nov. 4 2004.
    
    В 2004 году в Соединенных Штатах переход на летнее и зимнее время закончился 31 октября в 2: 00, когда часы откатились на 1: 00. Так что к 4 ноября они, безусловно, должны все идут по стандартному времени, но это не так! Например, в Chrome dev tools на консоли, с часами, установленными в восточном часовом поясе США:
    > new Date(2004,10,7,0,0)
      Sun Nov 07 2004 00:00:00 GMT-0400 (Eastern Daylight Time)
    
    > new Date(2004,10,7,1,0)
      Sun Nov 07 2004 01:00:00 GMT-0500 (Eastern Standard Time)
    
    Он назначает дату перехода на 7 ноября. Это следующее правило "первого воскресенья ноября", которое в настоящее время действует, но в 2004 году это правило должно было быть старым правилом"последнего воскресенья октября".

    Обновление 1

    Он не ограничивается браузером. он также терпит неудачу в Узел.js

    Узел.JS скриншот

    И просто чтобы доказать, что IE в порядке, вот вывод из IE10:

    Скриншот IE10

    Интересно, что IE и Firefox разрешают неоднозначность 1: 00 Как дневное время, в то время как Chrome разрешает ее как стандартное время, но это отдельная проблема. Он действительно выбирает правильную дату перехода.

    Обновление 2

    Стоит отметить, что в последнем Firefox 21 эта проблема действительно происходит, но она представляет себя по-другому, потому что это усугубляется еще одной проблемой, которая переключает дневной свет для стандартных имен, даже если используется правильное смещение. В других словах, в Firefox, вывод выглядит следующим образом:

    Скриншот Firefox

    Comments

      Ничего не найдено.