Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 日期上toJSON()的结果在IE8和IE9之间是不同的+;_Javascript_Json_Datetime_Internet Explorer 8 - Fatal编程技术网

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

Javascript 日期上toJSON()的结果在IE8和IE9之间是不同的+;,javascript,json,datetime,internet-explorer-8,Javascript,Json,Datetime,Internet Explorer 8,我正在做一个从日期到字符串再到字符串的转换,以便在sessionStorage中使用。 所以我首先要做的是: sessionStorage.currentDate = myDate.toJSON(); 然后我做这个: if (sessionStorage.currentDate ) { myDate = new Date(sessionStorage.currentDate); } 问题是,IE9+中的myDate.toJSON()函数返回“2013-05-06T22:00:00.0

我正在做一个从日期到字符串再到字符串的转换,以便在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中,后续重新转换为日期失败(新日期(sessionStorage.currentDate)的结果是
NaN

你知道为什么会发生这种情况,以及如何让这段代码为IE8+工作吗

更新:
我试图在调试中替换该字符串,结果发现这两个字符串都不起作用。因此,实际上似乎是
新日期(sessionStorage.currentDate)
无法识别格式(即UTC)

我认为您需要针对这一点进行IE8特定的浏览器攻击。为此需要额外的代码,如

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

我不认为不同数量的地方是“不起作用”的情况。发件人:

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

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


就修复而言,一个简单的正则表达式替换应该可以做到这一点——将
\.\d+Z
的所有匹配项替换为
Z
(我假设您不需要毫秒级精度!)。这将为您提供一个适用于IE8的字符串,即使它是在ES5之前从IE9生成的,日期解析完全依赖于实现。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。

您确定IE9示例正确吗?这是允许的秒数的三位数。你的意思是22:00:00.000Z吗?对不起,我更正了这个问题,我知道这是允许的,但转换只是在ie8中返回NaN,我无法解释为什么。我看不出针对Zerkms的建议解决方案。000的时间是一个完全有效的表示,但IE8并不理解,因此您得到了NaN。我最初提到的建议解决方案不幸被删除,因此我添加了一个自己的解决方案。我在尝试您的解决方案后添加了一个更新。我认为这个问题与我最初的想法不同,是的,请阅读一篇文章,了解新问题的解决方案。你的记号也可能是字符串。或者,以yyyy-mm-dd hh:mm:ss格式存储日期。基本上,您使用的日期格式仅在浏览器子集中受支持;我只是建议您考虑使用更广泛支持的格式,避免杂乱无章的解决方案。这实际上是我为WCF Web服务所做的日期所做的事情,所以我已经具备了这个功能。我没想到我自己会在约会中用到它。如果我的函数有效,我会尝试,然后我会接受这个答案。我建议只存储时间值,然后您只需执行
新建日期(时间值)
。创建一个需要解析才能使用的格式化字符串是没有意义的。可能是,最好使用“功能检测”,比如如果(新日期(“2013-12-31T00:00:00.000Z”)==NaN{window.pasedatex=function(str){/*手动解析*/};}否则{window.parseDateEx=function(str){return new Date(str);}