Array.SortメソッドなどでDateTime・DateTimeOffsetをソートする場合、デフォルトでは日時の小さい順(古い順)にソートされます。 日付を無視して時刻のみの大小関係でソートしたい場合は、次のようにTimeOfDayプロパティの値を比較するメソッドを用意してそれをSortメソッドに渡すようにします。
DateTimeOffsetの時刻のみを比較してソートする
Imports System
Class Sample
' DateTimeOffsetのTimeOfDayプロパティを比較するメソッド
Shared Function CompareTimeOfDay(ByVal x As DateTimeOffset, ByVal y As DateTimeOffset) As Integer
Return TimeSpan.Compare(x.TimeOfDay, y.TimeOfDay)
End Function
Shared Sub Main()
Dim a As New DateTimeOffset(2013, 4, 5, 6, 0, 0, new TimeSpan(9, 0, 0))
Dim b As New DateTimeOffset(2013, 4, 4, 8, 0, 0, TimeSpan.Zero)
Dim c As New DateTimeOffset(2013, 4, 3, 11, 0, 0, new TimeSpan(-5, 0, 0))
Dim arr() As DateTimeOffset = New DateTimeOffset() {a, b, c}
' デフォルトの順序(日時の小さい順)でソート
Array.Sort(arr)
For Each dto As DateTimeOffset In arr
Console.WriteLine("{0} (UTC: {1})", dto, dto.ToUniversalTime())
Next
Console.WriteLine()
' 時刻のみを比較してソート
Array.Sort(arr, AddressOf CompareTimeOfDay)
For Each dto As DateTimeOffset In arr
Console.WriteLine("{0} (TimeOfDay: {1})", dto, dto.TimeOfDay)
Next
Console.WriteLine()
End Sub
End Class
実行結果
2013/04/03 11:00:00 -05:00 (UTC: 2013/04/03 16:00:00 +00:00) 2013/04/04 8:00:00 +00:00 (UTC: 2013/04/04 8:00:00 +00:00) 2013/04/05 6:00:00 +09:00 (UTC: 2013/04/04 21:00:00 +00:00) 2013/04/05 6:00:00 +09:00 (TimeOfDay: 06:00:00) 2013/04/04 8:00:00 +00:00 (TimeOfDay: 08:00:00) 2013/04/03 11:00:00 -05:00 (TimeOfDay: 11:00:00)
TimeOfDayプロパティのかわりにDateTime.Dateプロパティ・DateTimeOffset.Dateプロパティを比較するようにすれば、日付のみを比較してソートするようにすることもできます。
ソートについてより詳しくは、基本型のソートと昇順・降順でのソートおよび複合型のソート・複数キーでのソートなどをご覧ください。