Момент разного поведения в разных браузерах - PullRequest
0 голосов
/ 28 декабря 2018

Пусть следующий фрагмент:

var dateJS = new Date("1950-09-09T23:00:00.000Z");
var dateMoment = moment("1950-09-09T23:00:00.000Z");

console.log("Javascript Epoch Time:", dateJS.valueOf());
console.log("Moment Epoch Time:", dateMoment.valueOf());
console.log("Is DST?", dateMoment.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

Если вы запускаете его с некоторыми версиями Firefox (например, Firefox 61.0.1) или с Microsoft Edge, вы получаете Is DST? true.Вместо этого, если вы запускаете его с другими версиями Firefox (например, 64.0) или любым Chrome, вы получаете Is DST? false.

В чем может быть причина?

NEW SNIPPET:

var mar1947 = moment("1947-03-20T00:00:00.000Z");
var sep1947 = moment("1947-09-10T00:00:00.000Z");
var mar1950 = moment("1950-03-20T00:00:00.000Z");
var sep1950 = moment("1950-09-10T00:00:00.000Z");
var mar2019 = moment("2019-03-20T00:00:00.000Z");
var sep2019 = moment("2019-09-10T00:00:00.000Z");

console.log("March 1947: Epoch Time / DST:", mar1947.valueOf(), mar1947.isDST());
console.log("September 1947: Epoch Time / DST:", sep1947.valueOf(), sep1947.isDST());
console.log("March 1950: Epoch Time / DST:", mar1950.valueOf(), mar1950.isDST());
console.log("September 1950: Epoch Time / DST:", sep1950.valueOf(), sep1950.isDST());
console.log("March 2019: Epoch Time / DST:", mar2019.valueOf(), mar2019.isDST());
console.log("September 2019: Epoch Time / DST:", sep2019.valueOf(), sep2019.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

Пожалуйста, запустите фрагмент с Chrome, а затем с Firefox 61.0.1 или Microsoft Edge и посмотрите, будет ли результат одинаковым.

Itне будет.

(Полная игровая площадка здесь https://codepen.io/anon/pen/yZMqrV)

1 Ответ

0 голосов
/ 06 февраля 2019

Ответ на вопрос "Является ли браузер MomentJS независимым?"может быть "Нет".Получение длинного от даты Момента может зависеть от браузера, который вы используете.То же касается и Date объекта Javascript.

Эта проблема связана с историческим применением DST во всех странах мира, а затем с историческими смещениями часовых поясов, которые не наблюдались до последних версий ECMAScript.Поэтому старые браузеры, такие как Firefox 61.0.1 и Microsoft Edge, не имеют правильного охвата правил DST, действующих во всех различных местах по всему миру.

Чтобы решить эту проблему, вы должны использовать.utc() метод MomentJS (как комментарий VincenzoC в моем ответе).

Итак, следующий код работает в каждом браузере: он всегда возвращает одно и то же время (Epoch Time) и «нормализует» DST каждый раз(всегда ложно):

var mar1947 = moment("1947-03-20T00:00:00.000Z").utc().startOf('day');
var sep1947 = moment("1947-09-10T00:00:00.000Z").utc().startOf('day');
var mar1950 = moment("1950-03-20T00:00:00.000Z").utc().startOf('day');
var sep1950 = moment("1950-09-10T00:00:00.000Z").utc().startOf('day');
var mar2019 = moment("2019-03-20T00:00:00.000Z").utc().startOf('day');
var sep2019 = moment("2019-09-10T00:00:00.000Z").utc().startOf('day');

console.log("March 1947:", mar1947.valueOf(), mar1947.isDST());
console.log("September 1947:", sep1947.valueOf(), sep1947.isDST());
console.log("March 1950:", mar1950.valueOf(), mar1950.isDST());
console.log("September 1950:", sep1950.valueOf(), sep1950.isDST());
console.log("March 2019:", mar2019.valueOf(), mar2019.isDST());
console.log("September 2019:", sep2019.valueOf(), sep2019.isDST());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

Обратите внимание, что этот метод не работает должным образом, если вы используете его после (а не до) других методов, таких как startOf() (см. Связанную проблемуна github )

Здесь вы можете использовать несколько игровых площадок: Codepen1 , Codepen2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...