Frage

In Anbetracht der folgenden JSON Datum Darstellung:

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

Wie Deserialisieren Sie dies in es ist JavaScript Date-type Form?

Ich habe versucht, MS AJAX JavaScrioptSerializer wie unten gezeigt:

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

Doch alles, was ich zurück bekommen, ist die wörtliche Zeichenfolge Datum.

War es hilfreich?

Lösung

Vorausgesetzt, Sie wissen, dass die Zeichenfolge ist auf jeden Fall ein Datum, das ich es vorziehen, dies zu tun:

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

Andere Tipps

Bertrand LeRoy, der auf ASP.NET Atlas / AJAX gearbeitet, beschrieben das Design des JavaScriptSerializer Datetime-Ausgabe und enthüllen den Ursprung der mysteriösen vorderen und hinteren Schrägstriche. Er machte diese Empfehlung:

  

eine einfache Suche ausführen für "\ / Date ((\ d +)) \ /" und ersetzt mit "new Date ($ 1)" vor dem eval   (Aber nach der Validierung)

ich ausgeführt, dass zum Beispiel:

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

Das ist sehr nahe an den viele der anderen Antworten:

  • Verwenden Sie ein verankert RegEx als Sjoerd Visscher hat -. Vergessen Sie nicht, die ^ und $
  • Vermeiden Sie string.replace, und das 'g' oder 'i' Optionen auf Ihrem RegEx. "/ Date (1271389496563) // Datum (1271389496563) /" sollte nicht funktionieren.

A JSON Wert ist eine Zeichenfolge, die Anzahl, Objekt, ein Array wahr, falsch oder null. Das ist also nur eine Zeichenfolge. Es gibt keine offizielle Möglichkeit, Termine in JSON darzustellen. Diese Syntax ist von der asp.net Ajax-Implementierung. Andere verwenden das ISO-8601-Format.

Sie können es wie folgt analysieren:

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

Der reguläre Ausdruck in der ASP.net AJAX deserialize Methode für eine Zeichenfolge sieht das so aussieht „/ Date (1234) /“ (Die Zeichenfolge selbst braucht eigentlich die Anführungszeichen und Schrägstriche enthalten). Um einen solchen String zu erhalten, müssen Sie das Zitat entkommen und zurück Zeichen Schrägstrich, so dass der JavaScript-Code die Zeichenfolge sieht aus wie "\" \ / Date (1234) \ / \ "".

erstellen

Dies funktioniert.

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

Es ist ein bisschen komisch, aber ich fand ich ein Datum serialisiert hatte, dann die Zeichenfolge aus, dass zurückgegeben serialisiert, dann Deserialisieren auf der Client-Seite einmal.

So etwas wie dies.

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

Für diejenigen, die nicht wollen, Microsoft Ajax verwenden, fügen Sie einfach einen Prototyp Funktion der String-Klasse.

z.

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

Sie möchten nicht eval benutzen? Versuchen Sie etwas Einfaches wie

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

Als Randbemerkung, benutzen ich zu denken, Microsoft von diesem Format irreführend war. Allerdings ist die JSON-Spezifikation ist nicht ganz klar, wenn es um die Definition einer Art und Weise kommt Daten in JSON zu beschreiben.

Eigentlich momentjs diese Art von Format unterstützt, könnten Sie so etwas tun:

    var momentValue = moment(value);

    momentValue.toDate();

Dies gibt den Wert in einem JavaScript-Datumsformat

Die große Zahl ist die Standard-JS Zeit

new Date(1221644506800)

Mi 17. September 2008 19.41.46 GMT + 1000 (EST)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top