it-swarm.com.de

Das "richtige" JSON-Datumsformat

Ich habe so viele verschiedene Standards für das JSON-Datumsformat gesehen:

"\"\\/Date(1335205592410)\\/\""         .NET JavaScriptSerializer
"\"\\/Date(1335205592410-0500)\\/\""    .NET DataContractJsonSerializer
"2012-04-23T18:25:43.511Z"              JavaScript built-in JSON object
"2012-04-21T18:25:43-05:00"             ISO 8601

Welches ist das Richtige? Oder am besten Gibt es einen Standard dafür?

931
Kamyar Nazeri

JSON selbst gibt nicht an, wie Datumsangaben dargestellt werden sollen, JavaScript hingegen.

Sie sollten verwenden das Format, das von Date 's toJSON method ausgegeben wird:

2012-04-23T18:25:43.511Z

Hier ist der Grund:

  1. Es ist für Menschen lesbar, aber auch prägnant

  2. Es wird richtig sortiert

  3. Es enthält Sekundenbruchteile, die helfen können, die Chronologie wiederherzustellen

  4. Es entspricht ISO 8601

  5. ISO 8601 ist seit mehr als einem Jahrzehnt international etabliert

  6. ISO 8601 wird von W3C , RFC3339 und XKCD unterstützt.

Davon abgesehen kann jede geschriebene Datumsbibliothek "Millisekunden seit 1970" verstehen. ThiefMaster ist also für die einfache Portierbarkeit richtig.

1530
funroll

JSON weiß nichts über Daten. Was .NET tut, ist ein nicht standardmäßiger Hack/eine Erweiterung.

Ich würde ein Format verwenden, das leicht in ein Date-Objekt in JavaScript konvertiert werden kann, d. H. Eines, das an new Date(...) übergeben werden kann. Das einfachste und wahrscheinlich tragbarste Format ist der Zeitstempel, der seit 1970 Millisekunden enthält.

108
ThiefMaster

Es gibt kein richtiges Format; Die JSON-Spezifikation legt kein Format für den Datumsaustausch fest, weshalb es so viele verschiedene Möglichkeiten gibt, dies zu tun.

Das beste Format ist wohl ein Datum, das im ISO 8601-Format dargestellt wird ( siehe Wikipedia ); Es ist ein bekanntes und weit verbreitetes Format und kann in vielen verschiedenen Sprachen verarbeitet werden, wodurch es sich sehr gut für die Interoperabilität eignet. Wenn Sie die Kontrolle über den generierten Json haben, stellen Sie beispielsweise anderen Systemen Daten im Json-Format zur Verfügung. Wählen Sie als Datumsaustauschformat 8601 aus.

Wenn Sie den generierten Json nicht steuern können, z. B. Sie sind Konsument von Json aus verschiedenen vorhandenen Systemen. Die beste Möglichkeit, dies zu erreichen, besteht darin, eine Dienstprogrammfunktion zur Datumsanalyse zu verwenden, die die verschiedenen erwarteten Formate verarbeitet.

34
Russ Cam

Von RFC 7493 (das I-JSON-Nachrichtenformat) :

I-JSON steht für Internet JSON oder Interoperable JSON, je nachdem, wen Sie fragen.

Protokolle enthalten häufig Datenelemente, die .__ enthalten sollen. Zeitstempel oder Zeitdauer. EMPFOHLEN wird, dass alle diese Daten Elemente werden als String-Werte im ISO 8601-Format angegeben, wie angegeben in RFC 3339 , wobei die zusätzlichen Einschränkungen eher in Großbuchstaben .__ sind. als Kleinbuchstaben verwendet werden, damit die Zeitzone nicht mit einbezogen wird voreingestellt, und diese optionalen Sekunden werden eingeschlossen, auch wenn ihr Wert ist "00". EMPFOHLEN wird auch, dass alle Datenelemente die Zeitdauer enthält, die der "Dauer" -Produktion in .__ entspricht. Anhang A von RFC 3339 mit den gleichen zusätzlichen Einschränkungen.

22
Bryan Larsen

Nur als Referenz habe ich dieses Format gesehen:

Date.UTC(2017,2,22)

Es funktioniert mitJSONP, das von der Funktion $.getJSON() unterstützt wird. Ich bin mir nicht sicher, ob ich so weit gehen würde, diesen Ansatz zu empfehlen ... einfach als Möglichkeit da rauszuwerfen, weil die Leute es so machen.

FWIW: Niemals Sekunden seit Epoch in einem Kommunikationsprotokoll oder Millisekunden seit Epoch verwenden, da diese dank der randomisierten Implementierung von Schaltsekunden gefährlich sind ).

Irgendwie ein Haustierhass, aber viele Leute glauben, dass UTC nur der neue Name für GMT ist - falsch! Wenn Ihr System keine Schaltsekunden implementiert, verwenden Sie GMT (oft als UTC bezeichnet, obwohl es falsch ist). Wenn Sie Schaltsekunden vollständig implementieren, verwenden Sie wirklich UTC. Zukünftige Schaltsekunden können nicht bekannt sein; Sie werden bei Bedarf von der IERS veröffentlicht und erfordern ständige Updates. Wenn Sie ein System ausführen, das versucht, Schaltsekunden zu implementieren, aber eine veraltete Referenztabelle enthält (häufiger als Sie vielleicht denken), haben Sie weder GMT noch UTC.

Diese Datumszähler sind nur kompatibel, wenn sie in einem aufgeschlüsselten Format (y, m, d usw.) ausgedrückt werden. Sie sind NIE in einem Epochenformat kompatibel. Merk dir das.

11
Tel

Ich glaube, dass das beste Format für universelle Interoperabilität nicht die ISO-8601-Zeichenfolge ist, sondern das von EJSON verwendete Format:

{ "myDateField": { "$date" : <ms-since-Epoch> } }

Wie hier beschrieben: https://docs.meteor.com/api/ejson.html

Vorteile

  1. Parsing-Leistung: Wenn Sie Datumsangaben als ISO-8601-Zeichenfolgen speichern, ist dies ideal, wenn Sie einen Datumswert in diesem bestimmten Feld erwarten, dies jedoch der Fall ist Ein System, das Werttypen ohne Kontext bestimmen muss. Sie analysieren jede Zeichenfolge nach einem Datumsformat.
  2. Keine Notwendigkeit zur Datumsüberprüfung: Sie müssen sich nicht um die Validierung und Überprüfung des Datums kümmern. Auch wenn eine Zeichenfolge dem ISO-8601-Format entspricht, handelt es sich möglicherweise nicht um ein echtes Datum. Dies kann mit einem EJSON-Datum niemals passieren.
  3. Eindeutige Typdeklaration: Was generische Datensysteme angeht, wenn Sie einen ISO-String als String speichern möchten in einem Fall und ein echtes Systemdatum in einem anderen Fall ermöglichen generische Systeme, die das ISO-8601-Zeichenfolgenformat verwenden, dies mechanisch (ohne Escape-Tricks oder ähnlich schreckliche Lösungen).

Fazit

Ich verstehe, dass ein für Menschen lesbares Format (ISO-8601-Zeichenfolge) für 80% der Anwendungsfälle hilfreich und nützlicher ist praktisch, und in der Tat sollte niemandem jemals gesagt werden nicht ihre Daten als ISO-8601-Zeichenfolgen zu speichern, wenn dies von ihren Anwendungen verstanden wird , aber für ein universell akzeptiertes Transportformat, das bestimmte Werte garantieren sollte um auf jeden Fall Termine zu sein, wie können wir Unklarheiten zulassen und brauchen für so viel Validierung?

3
Ciabaros

JSON selbst hat kein Datumsformat, es ist egal, wie jemand Daten speichert. Da diese Frage jedoch mit Javascript markiert ist, möchten Sie wahrscheinlich wissen, wie Sie Javascript-Daten in JSON speichern. Sie können nur ein Datum an die JSON.stringify-Methode übergeben, und diese verwendet standardmäßig Date.prototype.toJSON, die wiederum Date.prototype.toISOString verwendet ( MDN am Date.toJSON ):

const json = JSON.stringify(new Date());
const parsed = JSON.parse(json); //2015-10-26T07:46:36.611Z
const date = new Date(parsed); // Back to date object

Ich fand es auch nützlich, den Parameter reviver von JSON.parse ( MDN in JSON.parse ) zu verwenden, um ISO-Zeichenfolgen beim Lesen von JSON-Zeichenfolgen automatisch wieder in JavaScript-Daten zu konvertieren.

const someObj = {
 a: 'foo',
 b: new Date()
}
const json = JSON.stringify(someObj);

const parsed = JSON.parse(json, (key, value) => {
    const isoDate = new RegExp(/\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/);

    if (typeof value === 'string' &&  value.match(isoDate)){
        return new Date(value); // isostring, so cast to js date
    }
    return value;
});
console.log(parsed.b); // Date object
3
Justus Romijn

Wenn Sie Zweifel haben, rufen Sie einfach die Javascript-Webkonsole eines modernen Browsers auf, indem Sie F12 (Strg + K in Firefox) drücken und Folgendes schreiben:

new Date().toISOString()

Wird ausgeben:

2019-07-04T13: 33: 03.969Z

Ta-da !!

3
Shayan Ahmad

Die bevorzugte Methode ist die Verwendung von 2018-04-23T18:25:43.511Z...

Das Bild unten zeigt, warum dies der bevorzugte Weg ist:

JSON Date

Wie Sie sehen, hat Date eine native Methode toJSON, die return in diesem Format und leicht wieder in Date konvertiert werden kann ...

1
Alireza

In Sharepoint 2013 gibt es für das Abrufen von Daten in JSON kein Format zum Konvertieren des Datums in das reine Datumsformat, da dieses Datum im ISO-Format vorliegen sollte

yourDate.substring(0,10)

Dies kann für Sie hilfreich sein

0
raghava arr