DateTimeOffsetの比較について
知っている人にとっては何をいまさら、な感じなことですが知らなくてググってしまったのでメモメモ
確認は.Net 4.7.2でやってます。それ以外の奴や今後のことは知らない
Q
var t1 = new DateTimeOffset(2018, 5, 15, 12, 0, 0, TimeSpan.FromHours(0)); var t2 = new DateTimeOffset(2018, 5, 15, 12 + 1, 0, 0, TimeSpan.FromHours(1)); var t3 = new DateTimeOffset(2018, 5, 15, 12, 0, 0, TimeSpan.FromHours(1)); Console.WriteLine($"{t1} : {t2} = {t1 == t2}"); Console.WriteLine($"{t1} : {t3} = {t1 == t3}");
DateTimeOffset
型のt1~t3の比較です
コンソールにどうでるかというと
A
2018/05/15 12:00:00 +00:00 : 2018/05/15 13:00:00 +01:00 = True 2018/05/15 12:00:00 +00:00 : 2018/05/15 12:00:00 +01:00 = False
t1とt3が異なるのは当たり前ですが、t1とt2は同じ値ということになります
DateTimeOffset.Equals Method (DateTimeOffset, DateTimeOffset) (System)
にも同じこと書いてあるのでそういうものなんですね (UTCでの比較しかしないのかな?)
注意
そういうものなんですが、そういうものだと気づかずに困ったのが変更通知するプロパティです
// こんなの作ってあったとして static ReactiveProperty<DateTimeOffset> Time = new ReactiveProperty<DateTimeOffset>(); Time.Value = t1; // 変更通知が飛ぶ Time.Value = t2; // この代入では変更通知が飛ばない
って感じになります
ReactivePropertyが悪いわけではないですよ
自分で書いてもif (_time == value) return;
とか書くしDateTimeOffset
が同じって言うなら同じ値なんですよね
気を付けよう