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