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


我正在进行从Date到string的转换,然后返回在sessionStorage中使用。 所以我先这样做:

sessionStorage.currentDate = myDate.toJSON();

然后我这样做:

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

问题是, myDate.toJSON() 功能 IE9 + 回报 "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为单位)


2170
2017-07-11 11:54


起源

你确定IE9的例子是正确的吗?这是三位数允许的秒数。你的意思是22:00:00.000Z? - Adrian Wragg
抱歉,我纠正了这个问题 - Maurizio In denmark


答案:


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


12
2017-07-11 12:31



这实际上是Iøm已经为来自wcf web服务的日期所做的事情,所以我已经有了这个功能。对于我自己改造的日期,我并不需要它。如果我的功能有效,我会试试,然后我会接受这个答案。 - Maurizio In denmark
我建议只存储时间值,然后你就可以了 new Date(timeValue)。创建一个格式化的字符串是没有意义的,无论如何都需要将其解析为有用。 - RobG


我不相信不同数量的地方是“不工作”的情况。从 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
2017-07-11 12:06



我知道这是允许的,但转换只是在ie8中返回NaN而我无法解释原因。我没有看到提议的解决方案来自zerkms - Maurizio In denmark
使用.000的时间是完全有效的表示,但不是IE8理解的那个,因此你得到了NaN。不幸的是,我最初提到的建议解决方案已被删除,所以我添加了一个我自己的解决方案。 - Adrian Wragg
我在尝试您的解决方案后添加了更新。我认为问题与我最初的想法不同 - Maurizio In denmark
是的 - 请仔细阅读 stackoverflow.com/questions/5802461/... 解决新问题。 - Adrian Wragg
你的刻度也可以是字符串。或者,以yyyy-mm-dd hh:mm:ss格式存储日期。基本上,您使用的是仅在浏览器子集中支持的日期格式;我只是建议您考虑使用更广泛支持的格式,并避免使用hacky变通方法。 - Adrian Wragg


我认为你需要IE8特定的浏览器黑客为此。而对于这需要额外的代码,如......

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

-2
2017-07-11 12:05



可能是,最好使用“特征检测?如果是这样的话(新日期(”2013-12-31T00:00:00.000Z“)=== NaN){window.paseDateEx = function(str){/ *手动解析* /};} else {window.parseDateEx = function(str){return new Date(str);}} - Konstantin Isaev