C# DateTimeとDateTimeOffsetの比較について

DateTimeとDateTimeOffsetの比較をする際に、ローカルのタイムゾーンを変更すると、想定していない挙動になったので調べてわかったことをメモ。

 

特定の時間になっているかを判定する時に、

サーバーから受け取った文字列の現在時間を、DateTimeOffsetに変換して、

もう一方の比較先の文字列の時間を、DateTimeOffsetに一旦変換後、プロパティのDateTimeで比較していました。

※どちらもDateTimeOffsetのときのOffsetは+9時間

 

個々に出力すると同じ時間が出力されていたので、問題なさそうだと思っていたのですが、ローカルのタイムゾーンを変更すると、比較した際に、変更した分、日本時間からずれたのです。

 

どうやら、比較する際に、DateTime → DateTimeOffsetへ暗黙の型変換がされて、Offsetがローカルのものがつかわれたためにずれたようです。

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset.op_implicit?view=netframework-4.7.1

 

今回は、そもそもDateTimeで比較する必要がなかったため、DateTimeOffsetのまま、サーバー時刻と比較し、回避しました。

他にも、UTC同士で比較したり、どちらかのOffsetで、DateTimeOffset型のデータを作り直して比較するなど方法があるかもしれません。

 

参考

  • DateTime 構造体

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netcore-3.1

  • DateTimeOffset 構造体

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset?view=netcore-3.1

  • DateTimeOffset.Implicit(DateTime to DateTimeOffset) 演算子

https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset.op_implicit?view=netframework-4.7.1

https://qiita.com/katz/items/d0cad9bfee79ef10ec5c