2162 Stimmen

Wie formatiere ich ein Microsoft JSON-Datum?

Ich versuche mich zum ersten Mal an Ajax mit jQuery. Ich bin immer meine Daten auf meine Seite, aber ich habe einige Probleme mit den JSON-Daten, die für Datum Datentypen zurückgegeben wird. Im Grunde bekomme ich eine Zeichenfolge zurück, die wie folgt aussieht:

/Date(1224043200000)/

Von jemandem völlig neu zu JSON - Wie formatiere ich dies zu einem kurzen Datum Format? Sollte dies irgendwo in der jQuery-Code behandelt werden? Ich habe versucht, die jQuery.UI.datepicker Plugin mit $.datepicker.formatDate() ohne jeden Erfolg.

Zu Ihrer Information: Hier ist die Lösung, die ich mit einer Kombination aus den Antworten hier gefunden habe:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

Diese Lösung erhielt mein Objekt von der Callback-Methode und zeigte die Daten auf der Seite richtig mit der Datumsformat-Bibliothek.

27 Stimmen

Das könnte interessant sein: hanselman.com/blog/

10 Stimmen

Das Format /Date(...)/ ist spezifisch für Microsofts eingebautes JSON-Datumsformat - es ist nicht Teil eines Standards, und JSON, das von Javascript kommt, hat einen Standard: Das ISO-Format, das Javascript spezifiziert: stackoverflow.com/a/15952652/176877 Diese Frage bezieht sich also auf das JSON-Date-Format von Microsoft. Ich habe den Titel geändert, um dies zu verdeutlichen.

19 Stimmen

Das ist ein Scherz! Microsoft hat JSON seinen eigenen Stempel aufgedrückt! und auf Daten!! Wann lernen sie es endlich!

24voto

Chris Woodward Punkte 141

Am Ende fügte ich die "Zeichen in den regulären Ausdruck von Panos ein, um die Zeichen loszuwerden, die der Microsoft Serializer beim Schreiben von Objekten in ein Inline-Skript erzeugt:

Wenn Sie also eine Eigenschaft in Ihrem C# Code-Behind das ist etwas wie

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

Und in Ihrer aspx haben Sie

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

Sie würden etwas erhalten wie

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

Beachten Sie die doppelten Anführungszeichen.

Um dies in eine Form zu bringen, die eval korrekt deserialisieren wird, habe ich verwendet:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

Ich benutze Prototyp und um es zu verwenden, habe ich

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

23voto

Domenic Punkte 104864

In jQuery 1.5 können Sie, solange Sie die json2.js um ältere Browser abzudecken, können Sie alle von Ajax kommenden Daten wie folgt deserialisieren:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

Ich habe eine Logik eingebaut, die davon ausgeht, dass Sie alle Daten vom Server in UTC senden (was Sie auch tun sollten); der Verbraucher erhält dann ein JavaScript Date Objekt, das den richtigen Tick-Wert hat, um dies widerzuspiegeln. Das heißt, der Aufruf von getUTCHours() usw. auf dem Datum denselben Wert wie auf dem Server zurück, und der Aufruf von getHours() gibt den Wert in der lokalen Zeitzone des Benutzers zurück, die von seinem Browser bestimmt wird.

Dabei wird nicht berücksichtigt, dass WCF Format mit Zeitzonen-Offsets, obwohl das relativ einfach hinzuzufügen wäre.

0 Stimmen

Nur als Hinweis: Damit der Code funktioniert, müssen Sie die Methode startsWith des Stringtyps erstellen

21voto

dominic Punkte 31

Die Verwendung des jQuery UI datepicker - wirklich nur sinnvoll, wenn Sie bereits einschließlich jQuery UI sind:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

Ausgabe:

Oktober 15, 2008

20voto

Jé Queue Punkte 9947

Denken Sie nicht zu viel darüber nach. Wie wir seit Jahrzehnten getan haben, übergeben Sie einen numerischen Offset von der de-facto-Standard-Epoche des 1. Januar 1970 Mitternacht GMT/UTC/&c in Anzahl der Sekunden (oder Millisekunden) seit dieser Epoche. JavaScript mag es, Java mag es, C mag es, und das Internet mag es.

2 Stimmen

Und schade, dass es mehr als 20 Epochen zur Auswahl gibt. de.wikipedia.org/wiki/Epoche_(Bezugsdatum)

0 Stimmen

Das ist die Das Schöne an Normen .

19voto

Nick Perkins Punkte 7583

Alle diese Antworten haben eines gemeinsam: Sie speichern Datumsangaben als einen einzigen Wert (normalerweise eine Zeichenkette).

Eine andere Möglichkeit besteht darin, die inhärente Struktur von JSON zu nutzen und ein Datum als Liste von Zahlen darzustellen:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

Natürlich müssen Sie sicherstellen, dass sich beide Gesprächspartner über das Format (Jahr, Monat, Tag) einig sind, und welche Felder als Datumsangaben gedacht sind,... aber es hat den Vorteil, dass das Problem der Konvertierung von Datumsangaben in Zeichenketten vollständig vermieden wird. Es sind alles Zahlen - überhaupt keine Zeichenketten. Die Verwendung der Reihenfolge Jahr, Monat, Tag ermöglicht außerdem eine korrekte Sortierung nach Datum.

Nur denken außerhalb der Box hier - ein JSON Datum muss nicht als eine Zeichenfolge gespeichert werden.

Ein weiterer Vorteil dieser Vorgehensweise ist, dass Sie leicht (und effizient) alle Datensätze für ein bestimmtes Jahr oder einen bestimmten Monat auswählen können, indem Sie die Art und Weise nutzen, wie CouchDB behandelt Abfragen auf Array-Werte.

0 Stimmen

Dort ist ein Standardformat für Datumsangaben in JSON, nämlich das RFC 3339-Format.

0 Stimmen

@gnasher, das wäre schön, ist aber nicht der Fall. Es gibt keine Verweise von RFC 7159 auf 3339 oder umgekehrt. Es gibt keine de jure Standard-JSON-Datumsformat. Alles, was übrig bleibt, sind de facto Standards, die jeweils Vor- und Nachteile haben. Das ist das Schöne an Normen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X