---
# System prepended metadata

title: '`System.Text.Json` UTCの日時文字列を日本語環境でデシリアライズしても、 `DateTimeKind.Utc`の`DateTime`となる 2022-08-21'
tags: [DateTimeKind.Utc, System.Text.Json, DateTime]

---

---
lang: ja-jp
breaks: true
---
# `System.Text.Json` UTCの日時文字列を日本語環境でデシリアライズしても、 `DateTimeKind.Utc`の`DateTime`となる 2022-08-21

`"2022-06-30T05:18:18Z"`をデシリアライズしたDateTimeを何も考えずに`ToString()`すると、`2022/06/30 5:18:18` と出力される。

`ToLocalTime().ToString()`とすると、`2022/06/30 14:18:18`と出力される。

> System.Text.Json default DateTimeZoneHandling #1566
> https://github.com/dotnet/runtime/issues/1566

## カスタムコンバータを用意すればlocal DateTime にデシリアライズ可能。

```csharp=
public sealed class JsonConverterLocalDateTime : 
    JsonConverter<DateTime>
{
    public override DateTime Read(
        ref Utf8JsonReader reader,
        Type typeToConvert,
        JsonSerializerOptions options
        )
    {
        return reader.GetDateTime().ToLocalTime();
    }

    public override void Write(
        Utf8JsonWriter writer,
        DateTime value,
        JsonSerializerOptions options
        )
    {
        writer.WriteStringValue(value);
        //writer.WriteStringValue(
        //    DateTime.SpecifyKind(
        //        value,
        //        DateTimeKind.Utc
        //        )
        //    );
    }
}
```

```csharp=
JsonSerializerOptions jsonOptions;
jsonOptions = new JsonSerializerOptions(
    JsonSerializerDefaults.Web
    )
{
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
    WriteIndented = true,
    //    IncludeFields = true,
    ReadCommentHandling = JsonCommentHandling.Skip,
};

jsonOptions.Converters.Add(new JsonConverterLocalDateTime());
```

###### tags: `System.Text.Json` `DateTimeKind.Utc` `DateTime`
