11

我正在将日期转换为字符串并返回以在 sessionStorage 中使用。所以我首先这样做:

sessionStorage.currentDate = myDate.toJSON();

然后我这样做:

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

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

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

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

更新:

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

4

3 回答 3

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。

于 2013-07-11T12:31:33.773 回答
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+Zjust Z(我假设您不需要毫秒级的精度!)。这应该会给你一个在 IE8 上工作的字符串,即使它是从 IE9 生成的

于 2013-07-11T12:06:03.710 回答
-2

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

if(jQuery.browser.msie && jQuery.browser.version.substring(0, 1) == 8) {
    // add extra missing zero
}
于 2013-07-11T12:05:48.727 回答