Runtime: System.Text.Json Standard DateTimeZoneHandling

Erstellt am 1. Okt. 2019  ·  3Kommentare  ·  Quelle: dotnet/runtime

In JSON.NET können Sie:

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

Gibt es etwas Ähnliches in System.Text.Json ?
Wenn es keine Option zum Festlegen des Standardwerts gibt, kann er dann manuell übergeben werden?

Und was ist die Standardeinstellung ( Local , Utc , Unspecified )?

area-System.Text.Json

Hilfreichster Kommentar

@btecu leider ist die einzige Möglichkeit, die ähnliche Option in System.Text.Json zu haben, meiner Meinung nach, Folgendes zu tun:

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

und implementiere DateTimeConverter so

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}

Alle 3 Kommentare

cc @layomia bei Dates

Da in jedem dieser Formate eine DateTime gesetzt werden kann (zB mit und ohne Zeitzone\Offset), verwendet der Reader\Writer (und damit der Serializer) das, was verfügbar ist, und verwendet ein ISO 8601-Format, um dies darzustellen.

@btecu das ISO 8601-Profil wird standardmäßig im Serializer verwendet, z. B. 2019-07-26T16:59:57-05:00.

Für die Deserialisierung wird, wenn der Datetime-Offset als "hh:mm" angegeben wird, eine DateTime mit DateTimeKind.Local erstellt. "Z" ergibt DateTimeKind.Utc . Wenn kein Offset angegeben ist, wird eine DateTime mit DateTimeKind.Unspecified erstellt.
Die umgekehrte Zuordnung gilt für die Serialisierung: Schreiben eines DateTime mit DateTimeKind.Local ergibt eine ISO-Darstellung mit einem "hh:mm"-formatierten Offset und so weiter.

Weitere Informationen zur Unterstützung von DateTime und DateTimeOffset in System.Text.Json und zur Implementierung von benutzerdefinierter Analyse oder Formatierung finden Sie unter https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -Unterstützung.

@btecu leider ist die einzige Möglichkeit, die ähnliche Option in System.Text.Json zu haben, meiner Meinung nach, Folgendes zu tun:

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

und implementiere DateTimeConverter so

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

Timovzl picture Timovzl  ·  3Kommentare

ilmax picture ilmax  ·  3Kommentare

matty-hall picture matty-hall  ·  3Kommentare

jamesqo picture jamesqo  ·  3Kommentare

iCodeWebApps picture iCodeWebApps  ·  3Kommentare