Runtime: System.Text.Json default DateTimeZoneHandling

Dibuat pada 1 Okt 2019  ·  3Komentar  ·  Sumber: dotnet/runtime

Di JSON.NET Anda dapat:

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

Apakah ada yang serupa di System.Text.Json ?
Jika tidak ada opsi untuk mengatur default, dapatkah diteruskan secara manual?

Juga, apa defaultnya ( Local , Utc , Unspecified )?

area-System.Text.Json

Komentar yang paling membantu

@btecu sayangnya satu-satunya cara, saya pikir, untuk memiliki opsi serupa di System.Text.Json adalah dengan melakukan:

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

dan implementasikan DateTimeConverter seperti itu

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"));
    }
}

Semua 3 komentar

cc @layomia berkencan

Karena DateTime dapat diatur dalam setiap format tersebut (misalnya dengan dan tanpa zona waktu\offset), pembaca\penulis (dan dengan demikian pembuat serial) menggunakan apa yang tersedia dan menggunakan\asumsi format ISO 8601 untuk mewakilinya.

@btecu profil ISO 8601 digunakan secara default di serializer, misalnya 26-07-2019T16:59:57-05:00.

Untuk deserializing, jika offset datetime diberikan sebagai "hh:mm", DateTime dengan DateTimeKind.Local dibuat. "Z" akan memberikan DateTimeKind.Utc . Jika tidak ada offset yang diberikan, maka DateTime dengan DateTimeKind.Unspecified dibuat.
Pemetaan terbalik berlaku untuk serialisasi: menulis DateTime dengan DateTimeKind.Local akan menghasilkan representasi ISO dengan offset berformat "hh:mm", dan seterusnya.

Untuk mengetahui lebih lanjut tentang dukungan DateTime dan DateTimeOffset di System.Text.Json, dan bagaimana Anda dapat menerapkan penguraian atau pemformatan khusus, lihat https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -mendukung.

@btecu sayangnya satu-satunya cara, saya pikir, untuk memiliki opsi serupa di System.Text.Json adalah dengan melakukan:

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

dan implementasikan DateTimeConverter seperti itu

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"));
    }
}
Apakah halaman ini membantu?
0 / 5 - 0 peringkat