Результат 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)
Ответы
Ответ 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
}