實際上可以修改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;
}
(Credit :此代碼已基本從這個答案抄在一個相關的問題: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)}
想必您將這些日期序列化以將其存儲在localStorage中。在這種情況下,你可以通過使用像rhaboo這樣的包裝庫來避免像這樣或類似的仇恨。 – 2015-04-21 05:11:22