DateTimeとDateTimeOffsetは日付・時間の古い順に並べ替えられます。
並べ替えに際して、DateTimeではKindプロパティの値は無視されて日時のみが比較されます。 したがって、2000-01-01T00:00:00+00:00
(UTC)と2000-01-01T00:00:00+09:00
(ローカル時刻)と2000-01-01T00:00:00
(タイムゾーン指定なし)はいずれも同一の値として扱われます。 DateTimeの並べ替えでは、自動的にUTCに変換されてから並べ替えられるといったことはありません。 そのため、ToLocalTime・ToUniversalTimeメソッドを使って現地時刻・UTCのいずれかに統一してからソートしないと意図しない結果になる場合があります。
一方DateTimeOffsetでは、日時に加えてOffsetプロパティの値が考慮されて比較されます。 したがって、2000-01-01T00:00:00+09:00
、2000-01-01T00:00:00+00:00
、2000-01-01T00:00:00-05:00
はいずれも異なる値として比較されます。
日付型の値のソート順序
Imports System
Class Sample
Shared Sub Main()
Dim dateTimeArray As DateTime() = New DateTime() { _
New DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Local), _
New DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc), _
New DateTime(2000, 1, 1, 6, 0, 0, DateTimeKind.Utc), _
New DateTime(2000, 1, 1, 18, 0, 0, DateTimeKind.Utc), _
New DateTime(2000, 1, 2, 0, 0, 0, DateTimeKind.Local), _
New DateTime(2000, 1, 2, 0, 0, 0, DateTimeKind.Utc) _
}
Dim dateTimeOffsetArray As DateTimeOffset() = New DateTimeOffset() { _
New DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan( 0, 0, 0)), _
New DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(-5, 0, 0)), _
New DateTimeOffset(2000, 1, 1, 0, 0, 0, new TimeSpan(+9, 0, 0)), _
New DateTimeOffset(2000, 1, 2, 0, 0, 0, new TimeSpan( 0, 0, 0)), _
New DateTimeOffset(2000, 1, 2, 0, 0, 0, new TimeSpan(-5, 0, 0)), _
new DateTimeOffset(2000, 1, 2, 0, 0, 0, new TimeSpan(+9, 0, 0)) _
}
Array.Sort(dateTimeArray)
Array.Sort(dateTimeOffsetArray)
Console.WriteLine("DateTime")
For Each val As DateTime In dateTimeArray
Console.WriteLine("{0,-35:o} ({1:o})", val, val.ToUniversalTime())
Next
Console.WriteLine("DateTimeOffset")
For Each val As DateTimeOffset In dateTimeOffsetArray
Console.WriteLine("{0,-35:o} ({1:o})", val, val.ToUniversalTime())
Next
End Sub
End Class
実行結果
DateTime 2000-01-01T00:00:00.0000000Z (2000-01-01T00:00:00.0000000Z) 2000-01-01T00:00:00.0000000+09:00 (1999-12-31T15:00:00.0000000Z) 2000-01-01T06:00:00.0000000Z (2000-01-01T06:00:00.0000000Z) 2000-01-01T18:00:00.0000000Z (2000-01-01T18:00:00.0000000Z) 2000-01-02T00:00:00.0000000Z (2000-01-02T00:00:00.0000000Z) 2000-01-02T00:00:00.0000000+09:00 (2000-01-01T15:00:00.0000000Z) DateTimeOffset 2000-01-01T00:00:00.0000000+09:00 (1999-12-31T15:00:00.0000000+00:00) 2000-01-01T00:00:00.0000000+00:00 (2000-01-01T00:00:00.0000000+00:00) 2000-01-01T00:00:00.0000000-05:00 (2000-01-01T05:00:00.0000000+00:00) 2000-01-02T00:00:00.0000000+09:00 (2000-01-01T15:00:00.0000000+00:00) 2000-01-02T00:00:00.0000000+00:00 (2000-01-02T00:00:00.0000000+00:00) 2000-01-02T00:00:00.0000000-05:00 (2000-01-02T05:00:00.0000000+00:00)