C# DateTimeとDateTimeOffsetの比較について
DateTimeとDateTimeOffsetの比較をする際に、ローカルのタイムゾーンを変更すると、想定していない挙動になったので調べてわかったことをメモ。
特定の時間になっているかを判定する時に、
サーバーから受け取った文字列の現在時間を、DateTimeOffsetに変換して、
もう一方の比較先の文字列の時間を、DateTimeOffsetに一旦変換後、プロパティのDateTimeで比較していました。
※どちらもDateTimeOffsetのときのOffsetは+9時間
個々に出力すると同じ時間が出力されていたので、問題なさそうだと思っていたのですが、ローカルのタイムゾーンを変更すると、比較した際に、変更した分、日本時間からずれたのです。
どうやら、比較する際に、DateTime → DateTimeOffsetへ暗黙の型変換がされて、Offsetがローカルのものがつかわれたためにずれたようです。
DateTime.Kind プロパティの値が DateTimeKind.Utcの場合、DateTimeOffset オブジェクトの日付と時刻は
dateTime
に等しい値に設定され、その Offset プロパティは0に設定されます。DateTime.Kind プロパティの値が DateTimeKind.Local または DateTimeKind.Unspecifiedの場合は、DateTimeOffset オブジェクトの日付と時刻が
dateTime
に設定され、その Offset プロパティがローカルシステムの現在のタイムゾーンのオフセットに等しい値に設定されます。
今回は、そもそもDateTimeで比較する必要がなかったため、DateTimeOffsetのまま、サーバー時刻と比較し、回避しました。
他にも、UTC同士で比較したり、どちらかのOffsetで、DateTimeOffset型のデータを作り直して比較するなど方法があるかもしれません。
参考
- Date
Time 構造体
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetime?view=netcore-3.1
- Date
Time Offset 構造体
https://docs.microsoft.com/ja-jp/dotnet/api/system.datetimeoffset?view=netcore-3.1
- Date
Time Offset. Implicit(DateTime to DateTimeOffset) 演算子
https://qiita.com/katz/items/d0cad9bfee79ef10ec5c