Runtime: System.Text.Json рдбрд┐рдлрд╝реЙрд▓реНрдЯ DateTimeZoneHandling

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдЕрдХреНрддреВре░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dotnet/runtime

JSON.NET рдореЗрдВ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

рдХреНрдпрд╛ System.Text.Json рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реА рд╣реИ?
рдпрджрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рд╛рде рд╣реА, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрдпрд╛ рд╣реИ ( Local , Utc , Unspecified )?

area-System.Text.Json

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@btecu рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, System.Text.Json рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рд░рдЦрдирд╛ рд╣реИ:

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

рдФрд░ рдЙрд╕ рддрд░рд╣ рдбреЗрдЯрдЯрд╛рдЗрдо рдХрдирд╡рд░реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

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

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cc @layomia рддрд╛рд░реАрдЦреЛрдВ рдкрд░

рдЪреВрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрдЯрд╛рдЗрдо рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЬрд╝реЛрди рдСрдлрд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдФрд░ рдмрд┐рдирд╛), рдкрд╛рдардХ рд▓реЗрдЦрдХ (рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ) рдЬреЛ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдПрд╕рдУ 8601 рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

@btecu рдЖрдИрдПрд╕рдУ 8601 рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 2019-07-26T16:59:57-05:00ред

deserializing рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдбреЗрдЯрд╛рдЯрд╛рдЗрдо рдСрдлрд╝рд╕реЗрдЯ "hh:mm" рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ DateTimeKind.Local рд╕рд╛рде рдПрдХ рдбреЗрдЯрдЯрд╛рдЗрдо рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред "Z" DateTimeKind.Utc ред рдпрджрд┐ рдХреЛрдИ рдСрдлрд╝рд╕реЗрдЯ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ DateTimeKind.Unspecified рд╕рд╛рде рдбреЗрдЯрдЯрд╛рдЗрдо рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд░рд┐рд╡рд░реНрд╕ рдореИрдкрд┐рдВрдЧ рдХреНрд░рдорд╛рдВрдХрди рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: DateTime рдХреЛ DateTimeKind.Local рд╕рд╛рде рд▓рд┐рдЦрдиреЗ рд╕реЗ "hh:mm" -рдлреЙрд░реНрдореЗрдЯреЗрдб рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ ISO рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ред

System.Text.Json рдореЗрдВ рдбреЗрдЯрдЯрд╛рдЗрдо рдФрд░ рдбреЗрдЯрдЯрд╛рдЗрдо рдСрдлрд╕реЗрдЯ рд╕рдорд░реНрдерди рдФрд░ рдЖрдк рдХрд╕реНрдЯрдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдпрд╛ рдлрд╝реЙрд░реНрдореЗрдЯрд┐рдВрдЧ рдХреЛ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -рд╕рд╣рдпреЛрдЧред

@btecu рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, System.Text.Json рдореЗрдВ рд╕рдорд╛рди рд╡рд┐рдХрд▓реНрдк рд░рдЦрдирд╛ рд╣реИ:

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

рдФрд░ рдЙрд╕ рддрд░рд╣ рдбреЗрдЯрдЯрд╛рдЗрдо рдХрдирд╡рд░реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

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"));
    }
}
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jchannon picture jchannon  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

GitAntoinee picture GitAntoinee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

omariom picture omariom  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

yahorsi picture yahorsi  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

chunseoklee picture chunseoklee  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ