momentjs toDate - разный вывод на разных клиентах / браузерах - PullRequest
0 голосов
/ 22 октября 2018

Я использую momentjs для анализа строки даты и преобразования ее в собственный JavaScript-код Date:

let dateString = '1980-04-06';
console.log(moment().utcOffset());
console.log(moment(dateString, 'YYYY-MM-DD').toDate());
<script src="https://cdn.jsdelivr.net/npm/moment@2.22.2/moment.min.js"></script>

Выход на клиенте 1 (Firefox 62) равен

120
Date 1980 - 04 - 05 T23: 00: 00.000 Z

, а на клиенте 2 (Firefox 52 ESR) равен

120
Date 1980 - 04 - 05 T22: 00: 00.000 Z

Может кто-нибудь объяснить мне, почему utcOffset одинаково (new Date().getTimezoneOffset() печатает также -120 на обоих клиентах), но Дата (час) отличается?

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Отображаемые смещения относятся к текущей дате и времени, а не к предоставленной дате.Если вы измените среднюю строку на log moment(dateString, 'YYYY-MM-DD').utcOffset(), вы должны увидеть, что результат в более старом Firefox 52 равен 60 вместо 120.

Способствующими факторами, объясняющими эту разницу, являются:

  • Правила перехода на летнее время для вашего часового пояса в 1980 году не такие, как сегодня.Предполагая Вену (из вашего профиля пользователя), в 1980 году начало летнего времени было в 00:00 6 апреля ( ссылка здесь ), то есть в первое воскресенье апреля.Текущее правило (2018) для Вены - последнее воскресенье марта, которое будет 25 марта 2018 года ( ссылка здесь ).

  • ECMAScript 5.1 (раздел 15.9.1.8) и более ранние версии требовали, чтобы браузеры всегда предполагали, что текущее правило DST действует в течение всего времени - даже если это не было тем, что произошло на самом деле.Это было исправлено в ECMAScript 6/2015 (раздел 20.3.1.8) .

  • ECMAScript 2015 был реализован в Firefox начиная с версии 54. Поскольку вы тестируете версию 52, вы видите старое поведение.

  • Поскольку это конкретное изменение летнего времени происходит прямо в полночь, и это переход с пружинного вперед, то 1980-04-06T00:00 недопустимо.Первый момент этого дня в этом часовом поясе - 1980-04-06T01:00.Момент позаботится об этом за вас, когда вы передадите значение только для даты.В текущем браузере (62, а не 52), если вы звоните .format() в данный момент, вы должны увидеть 1980-04-06T01:00:00+02:00.Обратите внимание, что это время уже в DST со смещением UTC + 02: 00.Преобразование в UTC - 1980-04-05T23:00:00Z, что соответствует корректным данным, как показано в ваших примерах.

Короче говоря, есть много причин использовать современные браузеры.Это один из них.

0 голосов
/ 23 октября 2018

Вы проверяете текущее смещение UTC , а не смещение экземпляра момента 1980 года.Я предполагаю, что если бы вы взяли moment(dateString, 'YYYY-MM-DD') и позвонили utcOffset на , что , вы бы получили разные смещения в разных браузерах.

Могу поспорить, что правила таковы, чтоваша зона изменилась с 1980 года (например, возможно, изменилось время перехода на летнее время, или было добавлено или исключено летнее время, или, возможно, стандартное смещение даже изменилось).Браузеры различаются по степени правильности получения исторических данных зоны, что приводит к ошибкам при интерпретации строк дат.Я подозреваю, что Firefox исправил свою базу данных исторических зон для вашей зоны, что привело к разному поведению в более новых версиях браузера.

...