对于日期而言,toJSON()的结果在IE8和IE9 +之间是不同的

时间:2013-07-11 11:54:51

标签: javascript json datetime internet-explorer-8

我正在进行从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 +?

更新

我试图在debug中替换字符串,结果发现2个字符串都不起作用。所以它实际上似乎是new Date(sessionStorage.currentDate)无法识别格式(即UTC)的问题

3 个答案:

答案 0 :(得分:12)

在ES5之前,解析日期完全取决于实现。 IE 8(及更低版本)不会解析ES5中指定的ISO 8601格式,因此请自行解析:

// 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。

答案 1 :(得分: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生成的

答案 2 :(得分:-2)

我认为你需要IE8特定的浏览器黑客为此。并且需要额外的代码,比如......

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