DST не совпадает между браузерами для старых дат - PullRequest
0 голосов
/ 11 апреля 2019

В Chrome, Firefox и Opera (в Windows 10 и / или Mac) при запуске moment('1957-10-19').isDST() возвращается false

В Edge и IE11 (в Windows) и Яндексе (в Windows и Mac) и Safari (в Mac и iPhone) один и тот же код возвращает true

В C # .NET new DateTime(1957, 10, 19).IsDaylightSavingTime() возвращает true

Какие из них правильные?

Есть ли хороший способ справиться с этим?

Я обнаружил это при сериализации таких дат из C # в JavaScript. Поскольку сервер и клиент не договариваются о том, была ли дата в летнее время, дата закончилась на час раньше, в 23:00 предыдущего дня.

Это не обязательно проблема moment.js, поскольку базовый JavaScript рассчитывает на тот же ответ. Эти тесты проводились на веб-сайте momentjs.com с компьютера в часовом поясе «Америка / Денвер» и на компьютерах в BrowserStack, которые находятся в часовом поясе «Америка / Los_Angeles».

1 Ответ

1 голос
/ 11 апреля 2019

zoneinfo имеет America/Denver, не соблюдающих летнее время до 1965 года.

https://github.com/eggert/tz/blob/2019a/northamerica#L455-L467

> moment.tz('1965-06-01','America/Denver').isDST()
true
> moment.tz('1964-06-01','America/Denver').isDST()
false

(Использование 1 июня, чтобы не думать о дате перехода, которая не была одинаковой для всехСША в прошлом.)

Он America/Los_Angeles наблюдает летнее время с остальной частью США с 1918 года.

> moment.tz('1918-06-01','America/Los_Angeles').isDST()
true
> moment.tz('1917-06-01','America/Los_Angeles').isDST()
false

Если вам требуется последовательное историческое время, используйте moment-timezone вместополагаться на объект Date браузера, что делает moment, если вы не указали часовой пояс.Кросс-платформенные несоответствия и различные версии браузеров работают здесь против вас, так же как и Javascript, который не требует правильного поведения.(Я полагаю, что .NET Framework просто неправильный, но я не знаю, почему, посмотрите .)

Используйте moment.tz.guess(), если вам нужно перевести пользователятекущее время в некотором часовом поясе (как вы можете догадаться).

...