Подтвердить что ты не робот

Результат toJSON() в дате отличается от IE8 и IE9 +

Я делаю преобразование из Date в строку и обратно для использования в sessionStorage. поэтому я сначала делаю это:

sessionStorage.currentDate = myDate.toJSON();

а затем я делаю это:

if (sessionStorage.currentDate ) {
    myDate = new Date(sessionStorage.currentDate);
}

Проблема в том, что функция myDate.toJSON() в IE9 + возвращает "2013-05-06T22:00:00.000Z", но в IE8 она возвращает "2013-05-06T22:00:00Z" пропущенную десятичную часть в конце. Дело в том, что в IE8 происходит сбой последующего повторного преобразования в дату (результат от new Date(sessionStorage.currentDate) равен NaN)

Любая идея, почему это происходит и как заставить этот код работать для IE8 +?

Обновление:

Я попытался заменить строку в debug, и оказалось, что ни одна из двух строк не работает. Таким образом, на самом деле это кажется проблемой new Date(sessionStorage.currentDate), не признающей формат (UTC)

4b9b3361

Ответ 1

До ES5 синтаксический анализ дат был полностью зависимым от реализации. IE 8 (и ниже) не будет анализировать формат ISO 8601, указанный в ES5, поэтому просто проанализируйте его самостоятельно:

// parse ISO format date like 2013-05-06T22:00:00.000Z
function dateFromISO(s) {
  s = s.split(/\D/);
  return new Date(Date.UTC(s[0], --s[1]||'', s[2]||'', s[3]||'', s[4]||'', s[5]||'', s[6]||''))
}

Предполагает, что строка - UTC.

Ответ 2

Я не считаю, что разное количество мест - это случай, когда что-то "не работает". Из https://en.wikipedia.org/wiki/ISO_8601#Times:

Десятичные дроби также могут быть добавлены к любому из трех временных элементов. [...] Дробь может быть добавлена ​​только к элементу времени наименьшего порядка в представлении. Чтобы обозначить "14 часов, 30 и половину минут", не включайте цифру секунд. Представьте это как "14: 30,5", "1430,5", "14: 30,5" или "1430,5". Нет ограничений на количество десятичных знаков для десятичной дроби. Однако количество сторон после запятой должно быть согласовано с общими сторонами.

Поэтому, поскольку toJSON преобразует время в формат ISO-8601, и обе строки, которые вы упомянули, являются действительными ISO-8601, похоже, что оба они верны - они просто различаются.

В терминах исправления простая замена регулярного выражения должна делать трюк - замените все соответствия для \.\d+Z только на Z (я предполагаю, что вам не нужна точность на миллисекундах!). Это должно дать вам строку, которая работает на IE8, даже если она была создана из IE9

Ответ 3

Вам не нужен взлом для браузера. Просто найдите формат T\d {2}:\d {2}:\d {2} Z и добавьте дополнительные нули, если он найден:

if (sessionStorage.currentDate ) {
  myDate = new Date(sessionStorage.currentDate.replace(/T(\d{2}:\d{2}:\d{2})Z/,"T$1.000Z"));
}

Ответ 4

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

if(jQuery.browser.msie && jQuery.browser.version.substring(0, 1) == 8) {
    // add extra missing zero
}