为什么JSON.stringify搞砸了我的date时间对象?

{ id: 1533, story_type_id: 1, content_id: 470, created_at: Sun, 05 Feb 2012 07:02:43 GMT, updated_at: Sun, 05 Feb 2012 07:02:43 GMT, type_name: 'post' } 

我有一个像上面的“date时间”字段的JSON对象。 这是完美的。 但是,当我把它串起来(我想把它存储在caching中),我得到这种格式:

 "created_at":"2012-02-05T07:02:43.000Z" 

这会导致问题,因为当我想JSON.parse这个,突然它不再是date时间格式,它与我的其他格式不兼容。

我能做些什么来解决这个问题? 我的应用程序中到处都是“created_at”。 我不想手动更改每一个。

没有特殊的方法来在JSON中序列化Date对象。 这就是为什么你得到标准化的string表示。 您需要通过将它们传递给Date构造函数将它们转换回Date对象。

 item['created_at'] = new Date(item['created_at']); 

更新:使用reviver函数(请参阅注释),可以返回Date对象。

 var item = JSON.parse(row, function (key, value) { if (key === 'created_at') { return new Date(value); } else { return value; } }); 

实际上可以修改一个Date对象如何被序列化成JSON。 结合reviver函数,可以创build一个双向的解决scheme,它将自动工作在序列化,并可以很容易地用于反序列化。

首先像这样修改序列化:

 Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() } 

这会将Date对象的表示forms更改为以前缀作为标记的UNIX时间戳记:

 > json = JSON.stringify({test:new Date()}); "{"test":"{timestamp}1380164268633"}" 

然后你可以创build一个reviver函数,它将自动过滤掉这些值:

 function json_deserialize_helper(key,value) { if ( typeof value === 'string' ) { var regexp; regexp = /^{timestamp}(\d*)$/.exec(value); if ( regexp ) { return new Date(+regexp[1]); } } return value; } 

(信用:这个代码基本上从这个答案在相关的问题中复制: https : //stackoverflow.com/a/14509447/2572897 )

现在用这个设置,我们之前的结果的反序列化将再次产生一个Date对象:

 > JSON.parse(json, json_deserialize_helper); Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)} 

或者您可以select不修改序列化,而是使用正则expression式来捕获标准的序列化格式:

 function json_deserialize_helper(key,value) { if ( typeof value === 'string' ) { var regexp; regexp = /^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d.\d\d\dZ$/.exec(value); if ( regexp ) { return new Date(value); } } return value; } 

例:

 > json = JSON.stringify({test:new Date()}) "{"test":"2013-09-26T03:05:26.563Z"}" > JSON.parse(json, json_deserialize_helper) Object {test: Thu Sep 26 2013 05:05:26 GMT+0200 (CEST)} 

Date.prototype.toJSON = function(){return moment(this).format('L'); }

您可以阅读更多关于时刻文件和定制你想要返回的datetypes。