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!

10voto

martinoss Punkte 4740

Sie können auch die JavaScript-Bibliothek verwenden moment.js Dies ist sehr nützlich, wenn Sie mit verschiedenen lokalisierten Formaten arbeiten und andere Operationen mit Datumswerten durchführen möchten:

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

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

Die Einrichtung der Lokalisierung ist so einfach wie das Hinzufügen von Konfigurationsdateien (Sie erhalten sie auf momentjs.com) zu Ihrem Projekt und die Konfiguration der Sprache:

moment.lang('de');

10voto

Umar Malik Punkte 53

Im Folgenden finden Sie eine recht einfache Lösung für das Parsen von JSON-Daten. Verwenden Sie die folgenden Funktionen nach Ihren Anforderungen. Sie müssen nur das JSON-Format Datum abgerufen als Parameter an die Funktionen unten übergeben:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}

9voto

StarTrekRedneck Punkte 1937

Das ist frustrierend. Meine Lösung war es, die "/ und /" aus dem Wert von ASP.NET JavaScriptSerializer generiert zu analysieren, so dass, obwohl JSON nicht ein Datum Literal haben kann, es immer noch vom Browser als ein Datum interpretiert wird, was alles, was ich wirklich will: {"myDate":Date(123456789)}

Benutzerdefinierter JavaScriptConverter für DateTime?

Ich muss die Richtigkeit von Roy Tinkers Kommentar betonen. Dies ist kein legales JSON. Es ist ein schmutziger, schmutziger Hack auf dem Server, um das Problem zu beseitigen, bevor es zu einem Problem für JavaScript wird. Es wird einen JSON-Parser abwürgen. Ich habe es verwendet, um den Start zu erleichtern, aber ich verwende es nicht mehr. Allerdings glaube ich immer noch, die beste Antwort liegt mit dem Ändern, wie der Server das Datum formatiert, zum Beispiel, ISO wie an anderer Stelle erwähnt.

2 Stimmen

Das ist kein legales JSON. Es wird nur funktionieren, wenn eval'ing mit einem Javascript-Interpreter. Aber wenn Sie einen JSON-Decoder verwenden, wird es zu ersticken.

1 Stimmen

Einverstanden. Und wenn ich es nur mit diesem einen Datenelement zu tun hätte, würde ich es nicht in Betracht ziehen. Aber wenn ich es mit einem Objekt mit mehreren Daten und anderen Eigenschaften zu tun habe, ist es einfacher, das Ganze zu eval(), als die Eigenschaften einzeln herauszusuchen. Letztendlich ist das eigentliche Problem das Fehlen eines (legalen) JSON-Datums. Solange es das nicht gibt, sind wir auf unsere kreativen Hacks angewiesen.

9voto

b_levitt Punkte 6693

TLDR: Sie können diesen reinen Datumswert nicht zuverlässig konvertieren, senden Sie stattdessen einen String...

...oder zumindest sollten fast alle diese Antworten so beginnen.

Es gibt eine Reihe von Umstellungsproblemen, die hier auftreten.

Dies ist ein Datum ohne Zeit

Was alle zu übersehen scheinen, ist die Anzahl der nachgestellten Nullen in der Frage - sie wird mit ziemlicher Sicherheit als Datum ohne Uhrzeit begonnen:

/Date(1224043200000)/

Wenn Sie dies von einer Javascript-Konsole aus als neues Datum ausführen (die Grundlage vieler Antworten)

new Date(1224043200000)

Sie erhalten:

enter image description here

Der ursprüngliche Fragesteller war wahrscheinlich in EST und hatte ein reines Datum (sql) oder ein DateTime (nicht DateTimeOffset) mit Mitternacht.

Mit anderen Worten, die Absicht ist, dass der Zeitanteil bedeutungslos ist. Wenn der Browser dies jedoch in der gleichen Zeitzone ausführt wie der Server, der es erzeugt hat, spielt es keine Rolle und die meisten Antworten funktionieren.

Bit nach Zeitzone

Wenn Sie den obigen Code jedoch auf einem Rechner mit einer anderen Zeitzone (z. B. PST) ausführen:

enter image description here

Sie werden feststellen, dass wir jetzt ein Tag hinter in dieser anderen Zeitzone. Dies wird nicht durch eine Änderung des Serialisierers behoben (der immer noch die Zeitzone im iso-Format enthält)

Das Problem

Date (sql) und DateTime (.net) haben keine Zeitzone, aber sobald man sie in etwas konvertiert, das dies tut (javascript inferred thru json in diesem Fall), ist die Standardaktion in .net, die aktuelle Zeitzone anzunehmen.

Die Zahl, die die Serialisierung erzeugt, ist Millisekunden seit Unix-Epoche oder:

(DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;

Das ist etwas, das new Date() in javascript als Parameter nimmt. Epoch ist von UTC, so jetzt haben Sie Zeitzone Informationen in dort, ob Sie es wollten oder nicht.

Mögliche Lösungen:

Es könnte sicherer sein, eine String-Eigenschaft auf Ihrem serialisierten Objekt zu erstellen, die NUR das Datum darstellt - ein String mit "10/15/2008" wird wahrscheinlich niemanden mit diesem Durcheinander verwirren. Aber auch hier müssen Sie beim Parsen vorsichtig sein: https://stackoverflow.com/a/31732581

Aber im Sinne der Beantwortung der gestellten Frage, wie sie ist:

function adjustToLocalMidnight(serverMidnight){ 
  var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
  var localOffset=-(new Date()).getTimezoneOffset(); 
  return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
}

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

9voto

Thomas Hansen Punkte 5473

Schauen Sie sich die aktuelle ISO-Norm an, etwa so:

yyyy.MM.ddThh:mm

Sie wird 2008.11.20T22:18 .

0 Stimmen

Laut JSON-Schema entspricht das Format "date-time" dem RFC 3339, Abschnitt 5.6. Sie sollten also "yyyy-MM-ddTHH:mm:ssZ" für Daten in GMT schreiben, oder das Z durch eine Zeitzone wie +hh:mm ersetzen.

0 Stimmen

Das Problem ist, dass WCF und andere "alte" MS JSON-Serialisierungen dieses Format nicht verwenden, und das muss berücksichtigt werden.

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