【问题标题】:Result of toJSON() on a date is different between IE8 and IE9+IE8 和 IE9+ 日期的 toJSON() 结果不同
【发布时间】:2013-07-11 11:54:50
【问题描述】:

我正在进行从日期到字符串的转换,然后再转换回来,以便在 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+ 吗?

更新:

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

【问题讨论】:

  • 你确定IE9的例子是正确的吗?这是秒数允许的三位数字。您是说 22:00:00.000Z 吗?
  • 对不起,我更正了问题

标签: javascript json datetime internet-explorer-8


【解决方案1】:

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

【讨论】:

  • 这实际上是我已经为来自 wcf Web 服务的日期所做的事情,所以我已经有了这个功能。没想到我转换自己的日期需要它。我会尝试我的功能是否有效,然后我会接受这个答案。
  • 我建议只存储时间值,然后您只需执行new Date(timeValue)。创建一个需要解析才能有用的格式化字符串是没有意义的。
【解决方案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,看来两者都是正确的 - 它们只是碰巧不同。 p>

就修复而言,一个简单的正则表达式替换应该可以解决问题 - 只需将 \.\d+Z 的所有匹配项替换为 Z(我假设您不需要毫秒级的精度!)。这应该会给你一个在 IE8 上工作的字符串,即使它是从 IE9 生成的

【讨论】:

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

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

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

【讨论】:

  • 可能,最好使用“特征检测”?像这样 if (new Date("2013-12-31T00:00:00.000Z") === NaN) { window. paseDateEx = function(str) { /* 手动解析*/ }; } else { window.parseDateEx = function (str) { return new Date(str); } }
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
相关资源
最近更新 更多