En realidad, es posible modificar cómo un objeto Date se serializará en JSON. Combinado con la función reviver, se puede crear una solución bidireccional que funcionará automáticamente en la serialización y se puede usar fácilmente en la deserialización.
En primer lugar modificar la serialización de esta manera:
Date.prototype.toJSON = function() { return "{timestamp}+" . this.getTime() }
Esto cambiará la representación de un objeto Date en una marca de tiempo UNIX con un prefijo como marcador:
> json = JSON.stringify({test:new Date()});
"{"test":"{timestamp}1380164268633"}"
continuación, puede crear una Función reviver que filtrará automáticamente estos valores:
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;
}
(Crédito Este código fue básicamente copiado de esta respuesta en una pregunta relacionada: https://stackoverflow.com/a/14509447/2572897)
Ahora, con esta configuración, deserialización de nuestro resultado de delante se traducirá en un objeto Date de nuevo:
> JSON.parse(json, json_deserialize_helper);
Object {test: Thu Sep 26 2013 04:57:48 GMT+0200 (CEST)}
o puede elegir no modificar la serialización, pero en lugar de utilizar la expresión regular para coger el formato de serialización estándar:
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;
}
Ejemplo:
> 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)}
Presumiblemente está serializando estas fechas para almacenarlas en localStorage. En ese caso, puedes evitar un aggro como este y similar usando una biblioteca contenedora como rhaboo. –