不同浏览器中日期值的JSON.stringify差异

我在HTML页面中有这个代码:

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

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

这是我在不同浏览器中得到的结果:

 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,但我假设它们会有相同的结果。

我能做些什么来使所有平台上的所有日期字符串相同吗? 我的后端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(); }; // } 

//您可能需要考虑加强服务器,以识别任何有效的ISO 8601时间格式:

‘2010-02-08T03:37:34.327Z’

‘2010-02-08T03:38:06Z’

‘2010-02-08T03:38 + 01:00’

‘2010-02-08T03:34:18-05:00’

‘2010-02-08T03:34Z’

‘2010-02-08’

这是一种将任何iso字符串转换为javascript日期对象的方法。 它可以在服务器上使用一点点翻译:

 Date.from_iso= function(s){ var D, M= [], hm, min= 0, d2, Rx= /([\d:]+)(\.\d+)?(Z|(([+\-])(\d\d):(\d\d))?)?$/; D= s.substring(0, 10).split('-'); if(s.length> 11){ M= s.substring(11).match(Rx) || []; if(M[1]) D= D.concat(M[1].split(':')); if(M[2]) D.push(Math.round(M[2]*1000));// msec } for(var i= 0, L= D.length; i 

为什么不在JQuery的Datepicker jQuery-UI插件中使用formatDate函数来生成服务器端所需的格式?