プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

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が同じって言うなら同じ値なんですよね

気を付けよう