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