二つのDateTime・DateTimeOffsetの大小関係(=日時の前後関係)を調べるには静的メソッドのCompareメソッド、インスタンスメソッドのCompareToメソッドを使うことが出来ます。 また、C#・VB.NETなどオーバーロードされた演算子を使用できる言語では、等価性の比較と同様に比較演算子も使うことが出来ます。 次の表は、DateTime・DateTimeOffsetの大小関係を求めるためのメソッド・演算子の一覧です。
メソッド・演算子 | 動作 |
---|---|
x > y | x が y よりも後の日時の場合に真(true)となる |
x >= y | x が y よりも後、もしくは等しい日時の場合に真(true)となる |
x < y | x が y よりも前の日時の場合に真(true)となる |
x <= y | x が y よりも前、もしくは等しい日時の場合に真(true)となる |
DateTime.Compare(x, y) DateTimeOffset.Compare(x, y) x.Compare(y) x.Compare(y) |
x が y よりも後の日時(x > y)の場合、正の値を返す x と y が同じ日時(x = y)の場合、0を返す x が y よりも前の日時(x < y)の場合、負の値を返す |
Compare・CompareToメソッド(および比較演算子)でDateTime同士の比較を行う場合、DateTime同士の減算の場合と同様に時刻の種類(Kindプロパティの値)は考慮されないため、常に同一タイムゾーンの時刻として比較される点に注意が必要です。 二つのDateTime同士の比較結果は、両者のTicksプロパティの値の大小を比較したものと同じとなります。 DateTimeに設定されている時刻の種類も考慮して比較するには、ToUniversalTime・ToLocalTimeメソッドで日時の種類をローカル時刻かUTCのどちらかに合わせた上で比較を行う必要があります。
Imports System
Class Sample
Shared Sub Main()
' 二つのDateTimeを比較する
Dim a As New DateTime(2013, 4, 5, 15, 0, 0)
Dim b As New DateTime(2013, 4, 3, 8, 30, 0)
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.CompareTo(b) : {0}", a.CompareTo(b))
Console.WriteLine("DateTime.Compare(b) : {0}", DateTime.Compare(a, b))
Console.WriteLine()
' 一方はローカル時刻、もう一方はUTCの異なる時刻同士を比較する
Dim c As New DateTime(2013, 4, 5, 15, 0, 0, DateTimeKind.Local) ' ローカル時刻
Dim d As New DateTime(2013, 4, 5, 15, 0, 0, DateTimeKind.Utc) ' UTC
Console.WriteLine("c = {0}", c)
Console.WriteLine("d = {0}", d)
Console.WriteLine("c < d : {0}", c < d)
Console.WriteLine("c > d : {0}", c > d)
Console.WriteLine("DateTime.Compare(c, d) : {0}", DateTime.Compare(c, d))
Console.WriteLine()
' 両者をUTCに統一して時刻同士を比較する
Dim uc As DateTime = c.ToUniversalTime()
Dim ud As DateTime = d.ToUniversalTime()
Console.WriteLine("uc = {0}", uc)
Console.WriteLine("ud = {0}", ud)
Console.WriteLine("uc < ud : {0}", uc < ud)
Console.WriteLine("uc > ud : {0}", uc > ud)
Console.WriteLine("DateTime.Compare(uc, ud) : {0}", DateTime.Compare(uc, ud))
Console.WriteLine()
End Sub
End Class
a = 2013/04/05 15:00:00 b = 2013/04/03 8:30:00 a > b : True a <= b : False a.CompareTo(b) : 1 DateTime.Compare(b) : 1 c = 2013/04/05 15:00:00 d = 2013/04/05 15:00:00 c < d : False c > d : False DateTime.Compare(c, d) : 0 uc = 2013/04/05 6:00:00 ud = 2013/04/05 15:00:00 uc < ud : True uc > ud : False DateTime.Compare(uc, ud) : -1
一方DateTimeOffset同士の場合は、Compare・CompareToメソッドでの比較の際にオフセット値も考慮されるため、事前にローカル時刻またはUTCに変換する必要はありません。 Compare・CompareToメソッドでは内部的に一旦双方の値をUTCに変換した上で比較が行われます。
DateTime・DateTimeOffsetはIComparableインターフェイスを実装しています。 IComparableインターフェイスとより高度な大小関係の比較処理については大小関係の定義と比較もご覧ください。
DateTime・DateTimeOffsetとソートについては基本型のソートと昇順・降順でのソートおよび基本型とデフォルトのソート順 §.日付型をご覧ください。