---
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`