我正在进行从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)的问题
答案 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
}