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

Я делаю преобразование из даты в строку и обратно для использования в 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+?

Обновить:

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

3 ответа

Решение

До 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.

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

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

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

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

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

if(jQuery.browser.msie && jQuery.browser.version.substring(0, 1) == 8) {
    // add extra missing zero
}
Другие вопросы по тегам