Nuestro grupo de trabajo ha pasado mucho tiempo buscando respuestas a tus interrogantes, te ofrecemos la solución por esto nuestro deseo es que sea de gran ayuda.
Solución:
JSON.parse
tiene un segundo parámetro poco conocido: la función ‘reviver’. Esto se usa precisamente para este propósito: revivir una fecha string en un Date
objeto (o, hipotéticamente, cualquier otro tipo de objeto que desee convertir de string) durante el análisis inicial.
Hay una publicación SO sobre esto, y aquí hay una publicación de blog que incluye un ejemplo de implementación y una función que verificará la propiedad de un par de codificaciones de fecha comunes (ISO y ese extraño formato .NET AJAX), antes de analizar a un Date
.
Aquí esta la key función de esa publicación de blog, fwiw:
// JSON date deserializer
// use as the second, 'reviver' argument to JSON.parse();
if (window.JSON && !window.JSON.dateParser) \]$/;
JSON.dateParser = function (key, value)
// first, just make sure the property is a string:
if (typeof value === 'string')
// then, use regex to see if it's an ISO-formatted string
var a = reISO.exec(value);
if (a)
// if so, Date() can parse it:
return new Date(value);
// otherwise, see if it's a wacky Microsoft-format string:
a = reMsAjax.exec(value);
if (a)
// and perform some jujitsu to make use of it:
var b = a[1].split(/[-+,.]/);
return new Date(b[0] ? +b[0] : 0 - +b[1]);
// here, you could insert any additional tests and parse instructions you like, for other date syntaxes...
// important: you need to return any values you're not parsing, or they die...
return value;
;
// use: JSON.parse(json,JSON.dateParser);
(Hay muchas opiniones sobre las expresiones regulares adecuadas para las fechas ISO 8601. YMMV. Además, no hay una razón particular para insertar la función en el objeto JSON global. Puede almacenarlo/referenciarlo en cualquier lugar que desee).
Seguí el consejo de @LastCoder y escribí una implementación simple. Parece estar haciendo lo que yo quería.
var jsonDates =
dtrx2: /d4-d2-d2/,
parse: function(obj)
var parsedObj = JSON.parse(obj);
return this.parseDates(parsedObj);
,
parseDates: function(obj)
// iterate properties
for(pName in obj)
// make sure the property is 'truthy'
if (obj[pName])
var value = obj[pName];
// determine if the property is an array
if (Array.isArray(value))
for(var ii = 0; ii < value.length; ii++)
this.parseDates(value[ii]);
// determine if the property is an object
else if (typeof(value) == "object")
this.parseDates(value);
// determine if the property is a string containing a date
else if (typeof(value) == "string" && this.dtrx2.test(value))
// parse and replace
obj[pName] = new Date(obj[pName]);
return obj;
;
Un ejemplo en vivo está disponible en jsbin. Una referencia está disponible en gist.
Para representar fechas usando JavaScript, descubrí que JSON usa ISO 8601, un string formato para codificar fechas como string. Sin embargo, cuando revisé por última vez, no existe un estándar oficial sobre cómo debería ser el formato de fecha. Los principales navegadores utilizan ISO 8601 como formato de codificación de fecha JSON.
Por lo tanto, las fechas se codifican como cadenas ISO 8601 y luego se usan como cadenas normales cuando el JSON se serializa y deserializa.
Dicho esto, las fechas ISO se pueden convertir en fechas de JavaScript mediante el uso del constructor de fechas de JavaScript, que acepta una amplia variedad de entradas para construir una fecha, siendo ISO 8601 una de ellas.
Obtener la fecha de hoy:
var curDate = new Date();
document.write(curDate); //Mon Feb 01 2016 12:57:12 GMT-0600 (Central Standard Time)
Analizarlo en un string:
var dateStr = JSON.parse(JSON.stringify(curDate));
document.write(dateStr);//2016-02-01T18:59:35.375Z
Luego conviértalo nuevamente a una fecha de javascript, usando el constructor:
var date = new Date(curDate);
document.write(date); //Mon Feb 01 2016 12:59:35 GMT-0600 (Central Standard Time)
Recuerda que tienes la capacidad de decir .