实际上可以修改 Date 对象如何序列化为 JSON。结合 reviver 功能,可以创建一个双向解决方案,该解决方案将自动进行序列化,并可轻松用于反序列化。
首先像这样修改序列化:
Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }
这会将 Date 对象的表示更改为带有前缀作为标记的 UNIX 时间戳:
> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"
然后你可以创建一个 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)}
或者您可以选择不修改序列化,而是使用正则表达式捕获标准序列化格式:
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)}