Несоответствие при преобразовании DateTime в JavaScript - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть веб-интерфейс ASP.NET с DateTimeZoneHandling, установленным на Local, и я получаю два разных результата при преобразовании в дату JavaScript.

Пример 1

Дата, возвращаемая с сервера 1932-10-13T00:00:00-04:00

var strDate = new Date("1932-10-13T00:00:00-04:00");

strDate.toISOString();    // 1932-10-13T04:00:00.000Z
strDate.toLocaleString(); // 10/12/1932, 11:00:00 PM

Пример 2

Дата, возвращаемая с сервера 2013-05-09T00:00:00-04:00

var strDate = new Date("2013-05-09T00:00:00-04:00");

strDate.toISOString();    // 2013-05-09T04:00:00.000Z
strDate.toLocaleString(); // 5/9/2013, 12:00:00 AM

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

Ответы [ 2 ]

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

Если вы просто пытаетесь отобразить дату так, как ее запомнил кто-то из живущих в это время (в вашем случае 13 октября произошло 13 октября), вы можете (ab) использовать Часовой пояс момента, который, по-видимому, форматирует дату как ожидалось:

moment.tz("1932-10-13T00:00:00-04:00", "America/Toronto").tz("UTC").format();  // 1932-10-13T04:00:00Z

В вашем случае, этот метод hack приводит к 1932-10-13T04:00:00Z, что может быть тем, что вы ищете.

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

Часовой пояс может меняться в некоторых локалях, например, я UTC-0300, и в определенные смены сезона он становится UTC-0200, поэтому он указывает, что ваша локаль также изменила смещение, заставляя его отображатьвремя на час меньше, в основном потому, что в вашем регионе для года принят другой сдвиг.

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

console.log("Example One");
var strDate = new Date("1932-05-09T00:00:00-04:00");

console.log(strDate.toISOString());
console.log(strDate.toLocaleString());

console.log("--------------------------");
console.log("Example Two");

var strDate2 = new Date("2013-05-09T00:00:00-04:00");

console.log(strDate2.toISOString());
console.log(strDate2.toLocaleString());

Дальнейшее объяснение UTC/Zulu time

Нормализовано изо-дата к дате зулуса (нулевое смещение iso date ).Это то же самое время и дата, но оно преобразовало смещение часового пояса в часы, и смещение часового пояса равно нулю.

date      [2013-05-09]
separator [T]
time      [00:00:00]
offset    [-04:00]

Фундаментальный аспект заключается в том, что 00:00:00.000-04:00 совпадает с 04:00:00.000Z.

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