12

您目前如何在 JavaScript 中解析 ISO8601 日期,例如2010-02-23T23:04:48Z ?

某些浏览器在使用下面的代码时会返回 NaN(包括 Chrome),但 FF3.6+ 可以。

<html>
<body>
  <script type="text/javascript">
  var d = Date.parse("2010-02-23T23:04:48Z");
  document.write(d);
</script>
</body>
</html>

你可以在这里试试这个http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_parse

4

4 回答 4

9

这是一个很好的实现,它涵盖了边缘情况并回退到本机实现。https://github.com/csnover/js-iso8601/

于 2011-07-20T12:13:21.713 回答
4

试试这个:http ://anentropic.wordpress.com/2009/06/25/javascript-iso8601-parser-and-pretty-dates/

于 2010-03-19T18:54:19.913 回答
3

正如其他人所提到的,它不在第三版规范中。然而,它在第 5 版规范中,我引用:

ECMAScript 基于 ISO 8601 扩展格式的简化定义了日期时间的字符串交换格式。格式如下:YYYY-MM-DDTHH:mm:ss.sssZ

所以它应该很快就会渗透到浏览器中(IE9、Chrome 1、Firefox 4 至少是一些支持 ISO 8601 日期的浏览器)。如果您想同时实现一个解决方案,您可能需要优化,以便您的脚本可以利用本机(如果可用):

(function ()
{
    if (isNaN(Date.parse("2010-02-23T23:04:48Z")))
    {
        var oldParse = Date.parse;
        Date.parse = function (strTime)
        {
           // regex test strTime for ISO 8601, use oldParse if it isn't
           // Use custom parser if it is.
        }
    }
})();
于 2010-03-20T00:34:01.363 回答
2

关于标题中的问题:不是本地的(正如你测试过的:))

Date.parse在 ECMA-262 (3/e) 中,对[15.9.4.2]的唯一要求是往返转换.toString().toUTCString()不会更改 Date 对象,即

 Date.parse(x.toString()) == Date.parse(x.toUTCString()) == x

并且.toString()[15.9.5.2].toUTCString()[15.9.5.42]Date.parse都依赖于实现,因此完全未指定可以解析的格式。

于 2010-03-19T18:58:05.137 回答