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!

1768voto

Roy Tinker Punkte 9976

eval() ist nicht erforderlich. Dies wird gut funktionieren:

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

El substr() Funktion nimmt die /Date( Teil, und die parseInt() Funktion erhält die Ganzzahl und ignoriert die )/ am Ende. Die sich daraus ergebende Zahl wird an die Date Konstrukteur.


Ich habe das Radix absichtlich weggelassen (das 2. Argument von parseInt ); siehe mein Kommentar unten .

Außerdem stimme ich völlig mit Rorys Kommentar : ISO-8601-Datumsangaben werden gegenüber diesem alten Format bevorzugt - daher sollte dieses Format im Allgemeinen nicht für Neuentwicklungen verwendet werden.

Für ISO-8601-formatierte JSON-Daten übergeben Sie einfach die Zeichenkette in die Date Konstrukteur:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

0 Stimmen

Die Ersetzungsfunktion ist sicherer für den Fall, dass MS beschließt, das Format zu ändern.

5 Stimmen

@Broam: Beide Methoden (die Ersetzen-Funktion und diese Antwort) müssten geändert werden, wenn MS das Format ändert.

0 Stimmen

@RoyTinker: Funktioniert das auch mit den manchmal vorkommenden +- Suffixen wie 1224043200000-0600

134voto

Panos Punkte 18703

Sie können dies verwenden, um ein Datum aus JSON zu erhalten:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

Und dann können Sie a JavaScript Datumsformat Skript (1,2 KB, wenn minified und gzipped), um es wie gewünscht anzuzeigen.

0 Stimmen

Danke für den Hinweis auf die Bibliothek. Ich konnte diese verwenden, um mein kurzes Datumsformat zu erhalten.

0 Stimmen

Ich glaube, in dieser Linie von JS ist etwas falsch. Die letzten beiden Schrägstriche wirken wie Kommentare. Ich weiß nicht, regexp genug, um es zu beheben.

8 Stimmen

An der Zeile ist nichts auszusetzen, die Reihenfolge ist \// . Der erste Schrägstrich ist maskiert, so dass er nicht als Kommentar zählt. Ihr Editor trickst Sie aus, die Zeile funktioniert einwandfrei.

105voto

Jason Jong Punkte 4270

Für diejenigen, die Newtonsoft verwenden Json.NET Lesen Sie, wie man das macht, unter Native JSON in IE8, Firefox 3.5 und Json.NET .

Auch die Dokumentation zum Ändern des Datumsformats, die von Json.NET geschrieben wurde, ist nützlich: Serialisierung von Daten mit Json.NET

Für diejenigen, die zu faul sind, hier die schnellen Schritte. Da JSON eine lose DateTime-Implementierung hat, müssen Sie die IsoDateTimeConverter() . Beachten Sie, dass seit Json.NET 4.5 das Standard-Datumsformat ISO ist, so dass der folgende Code nicht benötigt wird.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

Das JSON wird als

"fieldName": "2009-04-12T20:44:55"

Schließlich noch etwas JavaScript, um das ISO-Datum in ein JavaScript-Datum umzuwandeln:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

Ich habe es folgendermaßen verwendet

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);

6 Stimmen

Der JavaScript-Date-Konstruktor kann die Zeichenkette für Sie analysieren: new Date("2009-04-12T20:44:55")

5 Stimmen

Warnung - Die Formate und das Parsing des Date()-Konstruktors sind vor ECMAScript 6 nicht standardisiert. Zum Beispiel behandelt IE 9 das Datum, das Sie dem Konstruktor geben, als lokale Zeit, auch wenn es in IS0-8601 ist, was überall sonst als UCT impliziert wird. Verlassen Sie sich nicht auf den Datumskonstruktor, wenn Sie ältere Browser unterstützen. codeofmatt.com/2013/06/07/…

0 Stimmen

Die Übermittlung von Nicht-UTC-Daten wird Sie früher oder später in Schwierigkeiten bringen.

69voto

Aaron Punkte 775

Das ursprüngliche Beispiel:

/Date(1224043200000)/  

spiegelt nicht die von WCF verwendete Formatierung wider, wenn Daten über WCF REST unter Verwendung der integrierten JSON-Serialisierung gesendet werden. (zumindest unter .NET 3.5, SP1)

Ich fand die Antwort hier hilfreich, aber eine leichte Bearbeitung der Regex ist erforderlich, da es scheint, dass die Zeitzone GMT-Offset auf die Zahl zurückgegeben (seit 1970) in WCF JSON angehängt wird.

In einem WCF-Dienst habe ich:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

ApptVisitLinkInfo ist einfach definiert:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

Wenn "Feld2" als Json vom Dienst zurückgegeben wird, lautet der Wert:

/Date(1224043200000-0600)/

Beachten Sie die Zeitzonenverschiebung, die Teil des Wertes ist.

Die geänderte Regex:

/\/Date\((.*?)\)\//gi

Sie ist etwas eifriger und erfasst alles zwischen den Klammern, nicht nur die erste Zahl. Die resultierende Zeit sinze 1970, plus Zeitzone Offset können alle in die eval gefüttert werden, um ein Datum Objekt zu erhalten.

Die resultierende JavaScript-Zeile für das Ersetzen lautet:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");

10 Stimmen

Dies ist falsch, new Date(1224043200000-0600) wird nur 600 vom Datum abziehen, in diesem Fall 600 Milisekunden, nicht 6 Stunden, wie es sein sollte.

0 Stimmen

0 Stimmen

Ich denke, der Zeitzonen-Offset ist nur enthalten, wenn Sie eine Zeitzone auf das DateTime-Objekt in .NET haben (was das Standardverhalten ist). Wenn Ihr Datum in UTC ist, verwenden Sie DateTime.SpecifyKind(date, DateTimeKind.UTC) und Sie erhalten den richtigen UTC-Wert, wenn es serialisiert, ohne Offset, die Sie dann zurück in die Zeitzone des Benutzers konvertieren können, wie benötigt. Wenn es in lokaler Zeit ist, verwenden Sie .ToUniversalTime() und es wird in UTC konvertieren, und haben die "Kind" bereits für Sie angegeben.

65voto

Robert Koritnik Punkte 100480

Wiederholen Sie sich nicht - automatisieren Sie die Datumsumwandlung mit $.parseJSON()

Die Antworten auf Ihren Beitrag bieten eine manuelle Datumsumwandlung in JavaScript-Daten. Ich habe jQuery's erweitert $.parseJSON() ein wenig, so dass es in der Lage ist, Daten automatisch zu analysieren, wenn Sie es anweisen. Es verarbeitet ASP.NET-formatierte Datumsangaben ( /Date(12348721342)/ ) als auch ISO-formatierte Daten ( 2010-01-01T12.34.56.789Z ), die von nativen JSON-Funktionen in Browsern (und Bibliotheken wie json2.js) unterstützt werden.

Wie auch immer. Wenn Sie den Code für die Datumsumwandlung nicht ständig wiederholen wollen, schlage ich vor, Sie lesen dieser Blogbeitrag und holen Sie sich den Code, der Ihr Leben ein wenig leichter machen wird.

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