JSON在不同浏览器中的日期值的字符串中的差异是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我在HTML页面中有这样的代码:

alert(JSON.stringify(new Date()));

我在我的页面中包含了最新的json2.js(2009-09-29版本),以支持没有JSON.stringify()的旧浏览器。我也有jquery-1.3.2.js包括在内。我相信新的浏览器具有本机JSON支持,它只是传递给本机JSON功能。

以下是我在不同浏览器中获得的结果:

IE 8 on Windows XP: "2010-02-07T21:39:32Z"
Chrome 4.0 on Windows XP: "2010-02-07T21:39:59Z"
Firefox 3.0 of Windows XP: "2010-02-07T21:40:41Z"
Chrome 4.0 on Ubuntu linux:  "2010-02-07T21:41:49Z"
Firefox 3.0 on Ubuntu linux:  "2010-02-07T21:42:44Z"
Chrome 4.0 on Mac OSX: "2010-02-07T21:43:56Z"
Safari on Mac OSX: "2010-02-07T21:45:21Z"
Firefox 3.5 on Mac OSX: "2010-02-07T21:44:10.101Z"

注意最后一个?它包含毫秒,其他都没有。我没有在任何其他系统上安装FF3.5,但我假设他们会有相同的结果。

有什么我可以做的,使所有平台上的所有日期stringify相同?我的后端REST服务可以配置一个格式字符串来反序列化JSON日期,但它不能支持多种格式,只有一种。

提问于
用户回答回答于

我得到了这个工作添加以下的JavaScript:

// Added to make dates format to ISO8601
Date.prototype.toJSON = function (key) {
    function f(n) {
        // Format integers to have at least two digits.
        return n < 10 ? '0' + n : n;
    }

    return this.getUTCFullYear()   + '-' +
         f(this.getUTCMonth() + 1) + '-' +
         f(this.getUTCDate())      + 'T' +
         f(this.getUTCHours())     + ':' +
         f(this.getUTCMinutes())   + ':' +
         f(this.getUTCSeconds())   + '.' +
         f(this.getUTCMilliseconds())   + 'Z';
};

我相信这可能会减慢序列化,但它似乎使浏览器之间的事情保持一致。

用户回答回答于

还可以调整json2.js以便始终使用它自己的代码,Date.prototype.toJSON而不是可能的原生代码。在这里我取消了两行注释并且它可以正常工作:

// if (typeof Date.prototype.toJSON !== 'function') {

    Date.prototype.toJSON = function (key) {

        return isFinite(this.valueOf()) ?
               this.getUTCFullYear()   + '-' +
             f(this.getUTCMonth() + 1) + '-' +
             f(this.getUTCDate())      + 'T' +
             f(this.getUTCHours())     + ':' +
             f(this.getUTCMinutes())   + ':' +
             f(this.getUTCSeconds())   + 'Z' : null;
    };

    String.prototype.toJSON =
    Number.prototype.toJSON =
    Boolean.prototype.toJSON = function (key) {
        return this.valueOf();
    };
// }

扫码关注云+社区