日期上toJSON()的结果在IE8和IE9+之间不同

Result of toJSON() on a date is different between IE8 and IE9+

本文关键字:IE8 IE9+ 之间 结果 toJSON 日期      更新时间:2023-09-26

我正在进行从Date到string的转换,然后再转换回来,以便在sessionStorage中使用。所以我首先做这个:

sessionStorage.currentDate = myDate.toJSON();

然后我做这个:

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

问题是IE9+中的myDate.toJSON()函数返回"2013-05-06T22:00:00.000Z",但在IE8中,它返回的"2013-05-06T22:00:00Z"缺少末尾的小数部分。

事实是,在IE8中,后续重新转换为日期失败(new Date(sessionStorage.currentDate)的结果是NaN

知道为什么会发生这种情况,以及如何使这些代码适用于IE8+吗?

更新:

我试着在调试中替换这个字符串,结果发现这两个字符串都不起作用。因此,实际上似乎是new Date(sessionStorage.currentDate)无法识别格式(即UTC)的问题

在ES5之前,日期的解析完全依赖于实现。IE8(及更低版本)不会解析ES5中指定的ISO8601格式,所以只需自己解析即可:

// 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#Times:

小数部分也可以被添加到三个时间元素中的任何一个。[…]分数只能添加到表示中的最低阶时间元素。表示"14小时30分半"时,不包括秒数。表示为"14:30,5"、"1430,5"、"14:30.5"或"1430.5"。小数位数没有限制但是,小数位数需要得到通信方的同意。

因此,当toJSON将时间转换为ISO-8601格式,并且您提到的两个字符串都是有效的ISO-8601时,这两个字符串似乎都是正确的——它们只是碰巧不同

就修复而言,一个简单的正则表达式替换就可以了——只用Z替换'.'d+Z的所有匹配项(我假设您不需要毫秒级的精度!)。这将为您提供一个在IE8上工作的字符串,即使它是从IE9 生成的

我认为你需要对IE8特定的浏览器进行破解。为此需要额外的代码,比如。。。

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