二つのDateTime・DateTimeOffsetが等しいかどうか(同一の日時を表すかどうか)を調べるにはEqualsメソッドを使うことが出来ます。 このメソッドは、インスタンスメソッド・静的メソッドの二種類が用意されています。 C#・VB.NETなどオーバーロードされた演算子を使用できる言語では、Equalsメソッドの代わりに等価演算子==
・不等価演算子!=
,<>
を使って等価性の比較を行うことも出来ます。
Equalsメソッド(および等価・不等価演算子)でDateTime同士の比較を行う場合、DateTime同士の減算の場合と同様に時刻の種類(Kindプロパティの値)は考慮されないため、常に同一タイムゾーンの時刻として比較される点に注意が必要です。 二つのDateTime同士の比較においては、両者のTicksプロパティの値が同じであればDateTimeは等しいものとして扱われます。 そのため、DateTimeに設定されている時刻の種類も考慮して比較するには、ToUniversalTime・ToLocalTimeメソッドで日時の種類をローカル時刻かUTCのどちらかに合わせた上で比較を行う必要があります。
一方DateTimeOffset同士の場合は、Equalsメソッドでの比較の際にオフセット値も考慮されるため、事前にローカル時刻またはUTCに変換する必要はありません。 Equalsメソッドでは内部的に一旦双方の値をUTCに変換した上で比較が行われます。 オフセット値も含めて完全に同一の日時かどうかを比較したい場合には、DateTimeOffset.EqualsExactメソッドを使うことが出来ます。
Imports System
Class Sample
Shared Sub Main()
' 二つのDateTimeOffsetを比較する
Dim a As New DateTimeOffset(2013, 4, 5, 15, 0, 0, TimeSpan.Zero)
Dim b As New DateTimeOffset(2013, 4, 3, 8, 30, 0, TimeSpan.Zero)
Console.WriteLine("a = {0}", a)
Console.WriteLine("b = {0}", b)
Console.WriteLine("a = b : {0}", a = b)
Console.WriteLine("a <> b : {0}", a <> b)
Console.WriteLine("a.Equals(b) : {0}", a.Equals(b))
Console.WriteLine("DateTimeOffset.Equals(a, b) : {0}", DateTimeOffset.Equals(a, b))
Console.WriteLine()
' 一方はUTC+9、もう一方はUTC+0の異なる時刻同士を比較する
Dim c As New DateTimeOffset(2013, 4, 5, 15, 0, 0, new TimeSpan(9, 0, 0))
Dim d As New DateTimeOffset(2013, 4, 5, 15, 0, 0, TimeSpan.Zero)
Console.WriteLine("c = {0}", c)
Console.WriteLine("d = {0}", d)
Console.WriteLine("c = d : {0}", c = d)
Console.WriteLine()
' cと同一時刻でタイムゾーンが異なる時刻を比較する
Dim e As New DateTimeOffset(2013, 4, 5, 1, 0, 0, new TimeSpan(-5, 0, 0))
Console.WriteLine("c = {0}", c)
Console.WriteLine("e = {0}", e)
Console.WriteLine("c.Equals(e) : {0}", c.Equals(e))
Console.WriteLine("c.EqualsExact(e) : {0}", c.EqualsExact(e))
End Sub
End Class
a = 2013/04/05 15:00:00 +00:00 b = 2013/04/03 8:30:00 +00:00 a == b : False a != b : True a.Equals(b) : False DateTimeOffset.Equals(a, b) : False c = 2013/04/05 15:00:00 +09:00 d = 2013/04/05 15:00:00 +00:00 c == d : False c = 2013/04/05 15:00:00 +09:00 e = 2013/04/05 1:00:00 -05:00 c.Equals(e) : True c.EqualsExact(e) : False
DateTime・DateTimeOffsetはIEquatableインターフェイスを実装しています。 IEquatableインターフェイスとより高度な等価性の比較処理については等価性の定義と比較も合わせてご覧ください。