Array.SortメソッドなどでDateTime・DateTimeOffsetをソートする場合、デフォルトでは日時の小さい順(古い順)にソートされます。 日付を無視して時刻のみの大小関係でソートしたい場合は、次のようにTimeOfDayプロパティの値を比較するメソッドを用意してそれをSortメソッドに渡すようにします。
DateTimeOffsetの時刻のみを比較してソートする
using System;
class Sample {
// DateTimeOffsetのTimeOfDayプロパティを比較するメソッド
static int CompareTimeOfDay(DateTimeOffset x, DateTimeOffset y)
{
return TimeSpan.Compare(x.TimeOfDay, y.TimeOfDay);
}
static void Main()
{
var a = new DateTimeOffset(2013, 4, 5, 6, 0, 0, new TimeSpan(9, 0, 0));
var b = new DateTimeOffset(2013, 4, 4, 8, 0, 0, TimeSpan.Zero);
var c = new DateTimeOffset(2013, 4, 3, 11, 0, 0, new TimeSpan(-5, 0, 0));
var arr = new DateTimeOffset[] {a, b, c};
// デフォルトの順序(日時の小さい順)でソート
Array.Sort(arr);
foreach (var dto in arr) {
Console.WriteLine("{0} (UTC: {1})", dto, dto.ToUniversalTime());
}
Console.WriteLine();
// 時刻のみを比較してソート
Array.Sort(arr, CompareTimeOfDay);
foreach (var dto in arr) {
Console.WriteLine("{0} (TimeOfDay: {1})", dto, dto.TimeOfDay);
}
Console.WriteLine();
}
}
実行結果
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プロパティを比較するようにすれば、日付のみを比較してソートするようにすることもできます。
ソートについてより詳しくは、基本型のソートと昇順・降順でのソートおよび複合型のソート・複数キーでのソートなどをご覧ください。