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