前書き
.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 |
シリアライズ
シリアライズは、ドキュメントにある通りです。まとめてみます。
DateTime.Kindの値 | |||
---|---|---|---|
オプション | Unspecified | Utc | Local |
Local | 2013-01-21T00:00:00+09:00 | 2013-01-21T00:00:00+09:00 | 2013-01-21T00:00:00+09:00 |
Utc | 2013-01-21T00:00:00Z | 2013-01-21T00:00:00Z | 2013-01-20T15:00:00Z |
Unspecified | 2013-01-21T00:00:00 | 2013-01-21T00:00:00 | 2013-01-21T00:00:00 |
RoundtripKind | 2013-01-21T00:00:00 | 2013-01-21T00:00:00Z | 2013-01-21T00:00:00+09:00 |
実験ソース
ソースコードはこちらに置きました。
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()
を呼び出すときにオプションを渡します。
services.AddJsonFormatters(options =>
{
options.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
})