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:002000-01-01T00:00:00+00:002000-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)