またDateTime・DateTimeOffsetのコンストラクタでは月であれば1〜12、時間であれば0〜23の範囲内の値を指定しなければArgumentOutOfRangeExceptionがスローされますが、Add*メソッドではその範囲外の値も指定出来るため、45日後、26時間後、といった日時を求めることも出来ます。 これを利用して、例えば「1999年12月31日 27時30分」という時刻を「2000年01月01日 03時30分」に正規化するといったこともできます。 当然、Add*メソッドではうるう年での日数の違いも考慮された上で日時が計算されます。
DateTime.Addメソッドを使って日時を正規化する
using System;
class Sample {
static void Main()
{
var now = DateTime.Now; // 現在日時を取得
Console.WriteLine("now: {0}", now);
Console.WriteLine("3 days before: {0}", now.AddDays(-3.0).Date); // 3日前の日付を求める
Console.WriteLine();
// 日時「2012年2月28日 32時の5分前」を正規化する
var dt = new DateTime(2012, 2, 28);
dt = dt.AddHours(32.0); // 32時
dt = dt.AddMinutes(-5.0); // 5分前
Console.WriteLine(dt);
}
}
実行結果例
now: 2013/04/01 15:00:30 3 days before: 2013/03/29 0:00:00 2012/02/29 7:55:00
当然ながらこれらのメソッドで日時の加減算を行なっても、その結果として得られるDateTimeのKindおよびDateTimeOffsetのOffsetは加減算を行う前のものと同じものとなります(日時の加減算はDateTime.KindおよびDateTimeOffset.Offsetには影響しません)。