前書き

.Net Framework界隈では、Newtonsoft.Jsonがデファクトスタンダードでしょうか。

Newtonsoft.Jsonを使ってSystem.DateTime型を変換するときには、タイムゾーンの扱いに応じて4つのオプション Local Utc Unspecified RoundtripKind があります。

ドキュメントを読んでもいまいちわからなかったので実際に動かしてみました。

実験結果

デシリアライズ

2019-12-31T15:00:00.000Z という日付をデシリアライズすると、、、

オプション DateTimeの値 DateTime.Kindの値
Local 2020-01-01 00:00:00 Local
Utc 2019-12-31 15:00:00 Utc
Unspecified 2019-12-31 15:00:00 Unspecified
RoundtripKind 2019-12-31 15:00:00 Utc

シリアライズ

シリアライズは、ドキュメントにある通りです。まとめてみます。

</table> # 実験ソース ソースコードはこちらに置きました。 https://github.com/sengokyu/ex-DateTimeZoneHandling `dotnet run`コマンドで実行できます。 # 考察 自分の要件では`UTC`がよさげです。 JSON UTC文字列 -> UTCな`System.DateTime`へ Kind=Localな`System.DateTime` -> JSON UTC文字列 `System.DateTime`を`new`するときは、Kindを忘れずにLocalにセットしないとです。 # ASP.Net Coreにおける設定 `starup.cs`の中で、`.AddJsonFormatters()`を呼び出すときにオプションを渡します。 ```c# services.AddJsonFormatters(options => { options.DateTimeZoneHandling = DateTimeZoneHandling.Utc; }) ```
DateTime.Kindの値
オプションUnspecifiedUtcLocal
Local 2013-01-21T00:00:00+09:002013-01-21T00:00:00+09:002013-01-21T00:00:00+09:00
Utc 2013-01-21T00:00:00Z2013-01-21T00:00:00Z2013-01-20T15:00:00Z
Unspecified 2013-01-21T00:00:002013-01-21T00:00:002013-01-21T00:00:00
RoundtripKind 2013-01-21T00:00:002013-01-21T00:00:00Z2013-01-21T00:00:00+09:00