Frage an json.net – Verhindert, dass Json.NET 4.5 bei Verwendung von MicrosoftDateFormat den Zeitzonenoffset anfügt

20

Kurz von einem BrauchDateTimeConverterBase Implementierung gibt es eine Möglichkeit, Json.NET 4.5+ beizubehalten, wenn die Verwendung festgelegt istDateFormatHandling.MicrosoftDateFormatvom Anhängen eines Zeitzonen-Offsets für alle Nicht-UTC-WerteDateTime es ist gegeben?

<code>"\/Date(1333645844276-0600)\/"
</code>
Einzelheiten

Ich wechsle ein API-Projekt von der Verwendung des integrierten .NETJavaScriptSerializer Verwenden von Json.NET zum Generieren von JSON. In Json.NET für eine UTCDateTime, die standardmäßige datetime-Serialisierung ähnelte der .NET-Version:

<code>"\/Date(1333645844276)\/"
</code>

Anders als bei Nicht-UTCJavaScriptSerializer, Json.NET fügt einen Zeitzonen-Offset an die Ergebnisse an (-6 für meine Region, diese Jahreszeit):

<code>"\/Date(1333645844276-0600)\/"
</code>

Hier ist der Code, den ich verwende, um Json.NET 4.5+ wieder auf die umzuschalten\/Date(...)\/ Format (genanntMicrosoftDateFormat):

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
</code>

Die Lösung schien so einfach zu sein, als würde Json.NET angewiesen, eine andere zu verwendenDateTimeZoneHandling Rahmen. Ich habe jede Einstellung für versuchtDateTimeZoneHandling (Local, Utc, Unspecified, undRoundtripKind) und sie behalten alle "-0600" in der Ausgabe bei. Tatsächlich liefern sie alle identische Ergebnisse für eine Nicht-UTCDateTime.

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"
</code>
Vorbehalt

Idealerweise hätte ich alle meine Zeiten schon in UTC. Ich plane dies auf jeden Fall mit der nächsten Version dieser API. Da es sich um eine Live-API handelt, lohnt es sich nicht, eine Ausgabeänderung zu riskieren, bis eine neue Version veröffentlicht wird. Es scheint für die meisten JSON-Parsing-Systeme kein Problem zu sein, aber ich kann die Änderung nicht riskieren, da der JSON-Standard offiziell nichts über die Datumsserialisierung aussagt.

Ich habe auch dieses Problem, genau das gleiche Problem. kerzek

Deine Antwort

2   die antwort
11

Es scheint gut für mich zu funktionieren, siehe unten. Meine JSON.NET-Assembly meldet die Version "4.5.0.0".

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"
</code>

Vielleicht war es ein Fehler, der behoben wurde?

Datum explizit erstellen:

<code>var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
    }));
// {"thedate":"\/Date(1234652400000)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}
</code>
Bestätigt. Ich hatte genau das gleiche Problem. Hatte JSON.NET 4.5.7, aktualisiert auf 4.5.8 und deserialisiert jetzt datetime korrekt. Chad W
3

Ich habe eine Lösung gefunden, um den Zeitzonenversatz zu entfernenDateTime Für die neueste Version 9.0.0:

<code>var time = DateTime.Now;

Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));

//"{"thedate": "2016-12-15T09:20:00.9375403"};
</code>
Es hätte nicht so schwierig sein sollen, diese Antwort zu finden, da die anderen die Offset-Informationen nicht entfernen. viggity

Verwandte Fragen