Question

Étant donné la représentation de date JSON suivante:

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

Comment désérialisez-vous cela dans son formulaire de type date JavaScript?

J'ai essayé d'utiliser MS AJAX JavaScrioptSerializer comme indiqué ci-dessous:

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

Cependant, tout ce que je récupère est la date de chaîne littérale.

Était-ce utile?

La solution

À condition que vous sachiez que la chaîne est définitivement une date, je préfère le faire:

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

Autres conseils

Bertrand LeRoy, qui a travaillé sur ASP.NET Atlas / AJAX, a décrit la conception de la sortie DateTime de JavaScriptSerializer et a révélé l’origine des mystérieuses barres obliques avant et arrière. Il a fait cette recommandation:

  

lancez une recherche simple pour " \ / Date ((\ d +)) \ / " et remplacer par "nouvelle date (1 $)" avant l'éval   (mais après validation)

J'ai implémenté cela en tant que:

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

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/<*>quot;);
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 />");

Ceci est très proche des nombreuses autres réponses:

  • Utilisez un RegEx ancré comme Sjoerd Visscher l'a fait - n'oubliez pas le ^ et le $.
  • Évitez string.replace et les options 'g' ou 'i' de votre RegEx. "/ Date (1271389496563) // Date (1271389496563) /" ne devrait pas fonctionner du tout.

Une valeur JSON est une chaîne, un nombre, un objet, un tableau, true, false ou null. Donc, ceci est juste une chaîne. Il n'y a pas de moyen officiel de représenter les dates en JSON. Cette syntaxe provient de l'implémentation asp.net ajax. D'autres utilisent le format ISO 8601.

Vous pouvez l'analyser comme ceci:

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]);

L'expression régulière utilisée dans la méthode ASP.net AJAX deserialize recherche une chaîne qui ressemble à "/ Date; 1234) /". (La chaîne elle-même doit en fait contenir les guillemets et les barres obliques). Pour obtenir une telle chaîne, vous devrez échapper les guillemets et les guillemets. Ainsi, le code javascript utilisé pour créer la chaîne ressemble à "\". \ / Date (1234) \ / \ ".".

Cela fonctionnera.

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

C'est un peu bizarre, mais j'ai découvert que je devais sérialiser une date, puis sérialiser la chaîne renvoyée, puis désérialiser une fois côté client.

Quelque chose comme ça.

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);

Pour ceux qui ne souhaitent pas utiliser Microsoft Ajax, ajoutez simplement une fonction prototype à la classe string.

ex.

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

Vous ne voulez pas utiliser eval? Essayez quelque chose de simple comme

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

En guise de remarque, je pensais que Microsoft était trompeur en utilisant ce format. Cependant, la spécification JSON n’est pas très claire pour définir un moyen de décrire les dates en JSON.

En fait, momentjs supporte ce type de format, vous pourriez faire quelque chose comme:

    var momentValue = moment(value);

    momentValue.toDate();

Ceci renvoie la valeur dans un format de date javascript

Le grand chiffre représente l'heure JS standard

new Date(1221644506800)

Mer. 17 sept. 2008 19:41:46 GMT + 1000 (EST)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top