In realtà è possibile modificare il modo in cui un oggetto Date verrà serializzato in JSON. In combinazione con la funzione reviver, è possibile creare una soluzione bidirezionale che funzionerà automaticamente sulla serializzazione e può essere facilmente utilizzata per la deserializzazione.
prima modificare la serializzazione in questo modo:
Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }
Questo cambierà la rappresentazione di un oggetto Date in un timestamp UNIX con un prefisso come marcatore:
> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"
Quindi è possibile creare un funzione reviver che filtrerà automaticamente questi valori:
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;
}
(Credito : Questo codice è stato praticamente copiato da questa risposta in una questione connessa: https://stackoverflow.com/a/14509447/2572897)
Ora, con questa configurazione, la deserializzazione del nostro risultato da prima si tradurrà in un oggetto Date ancora:
> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}
Oppure si può scegliere non modificare la serializzazione, ma invece di utilizzare l'espressione regolare per catturare il formato di serializzazione di serie:
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;
}
Esempio:
> 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)}
Presumibilmente stai serializzando queste date per memorizzarle in localStorage. In tal caso, puoi evitare aggro come questo e simili usando una libreria di wrapper come rhaboo. –