9 Stimmen

Internet Explorer, Json.Net JavaScript Datum und Millisekunden Problem

Ich bin mir nicht sicher, ob es an mir liegt, dass ich etwas vermisse - oder an IE oder Json.Net.

Aber im Grunde funktioniert das:

new Date("2012-08-03T12:36:54.743Z")

Dies scheitert mit dem Fehler 'Ungültiges Datum':

new Date("2012-08-03T12:36:54.74Z")

Das zweite Datum wird in SQL Server gespeichert als:

2012-08-03 12:36:54.740

Es wird dann als JSON mit Json.Net serialisiert - Json.Net hat das Datum als 2012-08-03T12:36:54.74Z serialisiert, wodurch die letzte 0 abgeschnitten wird.

Meine Frage(n):

  • Ist dies ein beabsichtigtes Verhalten in IE - dass alle 3 Ziffern im Millisekundenbereich benötigt werden, um zu funktionieren?
  • Ist dies ein beabsichtigtes Verhalten in Json.Net - dass es immer die letzte 0 in einem Datum abschneidet?

11voto

fero Punkte 5890

Ich kann Ihnen nicht sagen, ob es beabsichtigt ist oder nicht, aber ich habe viel recherchiert und keine echte Lösung für dieses Problem gefunden. Es scheint, dass wir akzeptieren müssen, dass der IE nur genau drei Stellen akzeptiert. Der einzige Weg (für mich), um dieses Problem zu umgehen, besteht darin, einen benutzerdefinierten Konverter für Json.NET beim Serialisieren zu verwenden:

string json = JsonConvert.SerializeObject(
    whatEver,
    new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy-MM-dd\\THH:mm:ss.fffK"
        }
    );

(nur getestet mit Json.NET 4.0.8 und 4.5.8)

Das zwingt Json.NET, genau 3 Dezimalstellen zu verwenden.

Soweit ich weiß, serialisiert Json.NET DateTime-Werte im ISO-Format mit der maximal notwendigen Genauigkeit und lässt dabei führende Nullen in den Dezimalstellen des "Sekunden"-Werts weg.

Dies entspricht der Ausgabe von

someDateTimeValue.ToString("yyyy-MM-dd\\THH:mm:ss.FFFFFFFK")
  • Ein normaler DateTime wie DateTime.UtcNow wird mit bis zu 7 Stellen serialisiert, weil das die Genauigkeit eines DateTime (gemessen in Ticks) ist.
  • Wenn der "Sekunden"-Teil des DateTime weniger Dezimalstellen hat, lässt Json.NET diese führenden Nullen weg.
  • Ein Datumswert wie DateTime.Today wird daher keine Zahlen hinter dem "Sekunden"-Wert enthalten, weil es genau 0 ist.

Siehe auch diese Beschreibung benutzerdefinierter Datums- und Uhrzeitformatzeichenfolgen.

1voto

RockResolve Punkte 1353

Es ist IE. Die umfassendste Erklärung und Antwort, die ich gefunden habe, ist unter JavaScript: Welche Browser unterstützen das Parsen von ISO-8601-Datumszeichenfolgen mit Date.parse

Insbesondere

IE9 scheiterte an Millisekunden mit einer Anzahl von Stellen, die nicht 3 beträgt: (behoben in IE10)

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