Pregunta

Dada la siguiente JSON Fecha de representación:

"\/Date(1221644506800-0700)\/"

¿Cómo deserializar esta en JavaScript de la Fecha de tipo de formulario?

He intentado usar MS AJAX JavaScrioptSerializer como se muestra a continuación:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

Sin embargo, todo lo que obtiene es el literal de cadena fecha.

¿Fue útil?

Solución

Siempre y cuando se conozca la cadena es sin duda una fecha que prefieren hacer esto :

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))

Otros consejos

Bertrand LeRoy, quien trabajó en ASP.NET Atlas/AJAX, se describe el diseño de la JavaScriptSerializer DateTime salida y reveló el origen de las misteriosas iniciales y finales barras diagonales.Él hizo esta recomendación:

ejecutar una simple búsqueda de "\/Fecha((\d+))\/", y reemplazar con "new Date($1)" antes de la eval (pero después de la validación)

He implementado que como:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

Esto está muy cerca de muchas de las otras respuestas:

  • El uso de una anclado RegEx como Sjoerd Visscher lo hizo-no olvides ^ y $.
  • Evitar cadena.reemplazar, y la 'g' o 'i' opciones en su Expresión regular."/Fecha(1271389496563)//Fecha(1271389496563)/" no debe trabajar en todos.

Un JSON valor es una cadena, un número, un objeto, una matriz, true, false o null.Así que esto es sólo una cadena.No hay forma oficial para representar las fechas en JSON.Esta sintaxis es de la asp.net implementación de ajax.Otros utilizan el formato ISO 8601.

Usted puede analizar como esta:

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);

La expresión regular utilizada en la ASP.net AJAX deserializar método busca una cadena que parece "/Fecha(1234)/" (La cadena en sí misma debe contener las cotizaciones y barras).Para obtener dicha cadena, tendrá que escapar de la cotización y de la barra de caracteres, por lo que el código javascript para crear la cadena se parece a "\"\/Fecha(1234)\/\"".

Esto va a funcionar.

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

Es un poco raro, pero me pareció que tenía para serializar una fecha, entonces serializar la cadena devuelta desde que, a continuación, deserializar en el lado del cliente una vez.

Algo como esto.

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);

Para aquellos que no quieren utilizar Microsoft Ajax, simplemente agregue un prototipo de función para la clase string.

E. g.

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

No quiero usar eval?Trate de algo tan simple como

var date = new Date(parseInt(jsonDate.substr(6)));

Como una nota del lado, yo solía pensar que Microsoft era engañosa por el uso de este formato.Sin embargo, el JSON especificación no está muy claro cuando se trata de definir un modo de describir las fechas en JSON.

En realidad, momentjs apoya este tipo de formato, usted podría hacer algo como:

    var momentValue = moment(value);

    momentValue.toDate();

Esto devuelve el valor en javascript formato de fecha

El número grande es el estándar de JS tiempo

new Date(1221644506800)

Mie Sep 17 de 2008 19:41:46 GMT+1000 (EST)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top