2008-09-17 10 views
35

Compte tenu de la JSON suivante Date de représentation:désérialisation AJAX côté client JSON Dates

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

Comment deserialize-vous cela dans c'est de type JavaScript sous forme de date?

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

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

Cependant, tout ce que je reviens est la date de chaîne littérale.

+0

Utilisez-vous jQuery peut-être? Vérifiez mon billet de blog pour convertir automatiquement les dates afin que vous n'ayez pas à le faire manuellement. http://erraticdev.blogspot.com/2010/12/converting-dates-in-json-strings-using.html –

+0

Voir mes commentaires ci-dessous. Le code de votre blog échoue aux dates antérieures à l'époque. –

Répondre

28

Pourvu que vous connaissez la chaîne est sans aucun doute une date que je préfère faire:

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

Cela a fonctionné pour moi, ma méthode ToJson était en série DateTimes comme "\/Date (1251795081950) \ /" – CVertex

+2

Merci toi. 'var date = new Date (parseInt (jsonDate.substr (6)));' fonctionne aussi. –

1

Le grand nombre est le temps standard JS

new Date(1221644506800) 

Mer 17 septembre 2008 19:41:46 GMT + 1000 (HNE)

10

Une valeur JSON est une chaîne, nombre, objet, tableau , vrai, faux ou nul. Donc, c'est juste une chaîne. Il n'y a aucun moyen officiel de représenter les dates dans JSON. Cette syntaxe provient de l'implémentation d'aspax ajax. D'autres utilisent le format ISO 8601.

Vous pouvez 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]); 
+0

Cela n'a pas fonctionné pour moi – CVertex

+0

Ma méthode toJson crachait des dates sérialisées en tant que "\/Date (1251795070160) \ /", que votre code n'analyse pas. Je vais expliquer pourquoi plus tard, juste poster ici pour les autres – CVertex

+0

+1 pour préciser ce qu'une valeur JSON peut être et que les dates ne sont pas l'un d'entre eux, mais un format personnalisé. –

5

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

Cela fonctionnera.

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

Il est un peu bizarre, mais je l'ai trouvé que je devais sérialiser une date, puis sérialiser la chaîne retournée de cela, désérialiser puis sur le côté client une fois.

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

Le problème avec cette méthode est qu'il ne regarde pas le fuseau horaire: Sys.Serialization.JavaScriptSerializer.deserialize ("\" \\/Date (1221644506800 + 0200) \\/\ "") Les résultats seront les mêmes que: Sys. Serialization.JavaScriptSerializer.deserialize ("\" \\/Date (1221644506800 + 0300) \\/\ "") –

3

Pour ceux qui ne veulent pas utiliser Microsoft Ajax, il suffit d'ajouter une fonction de prototype à la classe de chaîne .

E.g.

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 quand il s'agit de définir un moyen de décrire des dates dans JSON.

+2

Cette regex ne fonctionnera pas pour les dates antérieures à l'époque, qui ont une valeur négative. Vous avez besoin de ceci: '/ \/Date \ ((-? \ D +) (?: - \ d +)? \) \ // i' –

16

Bertrand LeRoy, qui a travaillé sur ASP.NET Atlas/AJAX, described the design of the JavaScriptSerializer DateTime output et a révélé l'origine des mystérieuses barres obliques avant et arrière.Il a fait cette recommandation:

terme une recherche pour "\/Date ((\ d +)) \ /" et remplacer par "new Date (1 $)" avant la eval (mais après validation)

I mis en œuvre que:

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

Ceci est très proche de la plupart des autres réponses:

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

Une très bonne réponse .... dommage que je l'ai trouvé au fond de la liste pour la question. – GordonB

+6

Cette regex ne fonctionnera pas pour les dates antérieures à l'époque, qui ont une valeur négative. Vous avez besoin de quelque chose comme ceci: '/ \/Date \ ((-? \ D +) (?: - \ d +)? \) \ // i' –

1

En fait, momentjs prend en charge ce type de format, vous pourriez faire quelque chose comme:

var momentValue = moment(value); 

    momentValue.toDate(); 

Cela renvoie la valeur dans un format de date javascript

Questions connexes