DateTime.SubtractおよびDateTimeOffset.Subtractメソッドは、日時に対する減算を行う目的のほかにも、二つの日時同士の減算を行いその時間差を求める目的でも使うことができます。 日時同士の差を求めるため、このメソッドの戻り値は時間間隔を表すTimeSpanとなります。
このメソッドでDateTime同士の差を求める場合、時刻の種類(Kindプロパティの値)は考慮されないため、常に同一タイムゾーンの時刻として差が求められる点に注意が必要です。 DateTimeに設定されている時刻の種類も考慮して時間差を求めるには、ToUniversalTime・ToLocalTimeメソッドで日時の種類をローカル時刻かUTCのどちらかに合わせた上でSubstractメソッドを呼び出す必要があります。
DateTime.Subtractメソッドで2つの日時の時間間隔を求める
Imports System
Class Sample
Shared Sub Main()
' 日時aと日時bの時間差を求める
Dim a As New DateTime(2013, 4, 5, 15, 0, 0)
Dim b As New DateTime(2013, 4, 3, 8, 30, 0)
Dim diff As TimeSpan = a.Subtract(b)
Console.WriteLine(diff)
' 一方はローカル時刻、もう一方は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
diff = c.Subtract(d) ' 時刻の種類は考慮されないため、時間差は0として計算される
Console.WriteLine(diff)
' 両者をUTCに統一して時刻同士の差を求める
Dim uc As DateTime = c.ToUniversalTime()
Dim ud As DateTime = d.ToUniversalTime()
diff = uc.Subtract(ud)
Console.WriteLine(diff)
End Sub
End Class
実行結果
2.06:30:00 00:00:00 -09:00:00
一方DateTimeOffset同士の場合は、Substractメソッドでの減算時にオフセット値も考慮されるため、事前にローカル時刻またはUTCに変換する必要はありません。 Substractメソッドでは内部的に一旦双方の値をUTCに変換した上でその差が求められます。