月単位の日付計算
C#で日付を扱う際、「N日後」を計算するAddDaysと同様に、「Nヶ月後」や「Nヶ月前」を計算したい場面は非常に多くあります。例えば、サブスクリプションの更新日(1ヶ月後)や、ローンの支払いスケジュール(6ヶ月前)などを算出する場合です。
DateTime構造体は、この月単位の計算を簡単に行うためにAddMonthsメソッドを提供しています。
DateTime.AddMonths(int months) メソッド
AddMonthsメソッドは、DateTimeオブジェクトに対して、指定した月数(int型)を加算または減算します。
monthsに正の数(例:3)を指定すると、3ヶ月後の未来の日付が返されます。monthsに負の数(例:-6)を指定すると、6ヶ月前の過去の日付が返されます。
重要な特性:DateTimeの不変性(Immutable)
AddMonthsメソッド(およびAddDaysなど)は、元のDateTimeオブジェクトを直接変更しません。DateTime構造体は不変(Immutable)であるためです。
このメソッドは、計算結果として得られる新しいDateTimeオブジェクトを戻り値として返します。したがって、計算結果を利用するには、必ず新しい変数に代入する必要があります。
コード例1:Nヶ月後を求める(未来の日付)
AddMonthsに正の数を渡して、未来の日付を計算する例です。基準日(baseDate)から3ヶ月後の請求日(billingDate)を計算します。
using System;
public class AddMonthsFutureExample
{
public static void Main()
{
// 基準日: 2025年2月15日
DateTime baseDate = new DateTime(2025, 2, 15);
int monthsToAdd = 3;
// 3ヶ月後を計算
// AddMonthsは新しいDateTimeインスタンスを返す
DateTime billingDate = baseDate.AddMonths(monthsToAdd);
Console.WriteLine($"基準日: {baseDate:yyyy/MM/dd}");
Console.WriteLine($"3ヶ月後の請求日: {billingDate:yyyy/MM/dd}");
}
}
出力結果:
基準日: 2025/02/15
3ヶ月後の請求日: 2025/05/15
コード例2:Nヶ月前を求める(過去の日付)
AddMonthsに負の数を渡すことで、過去の日付を計算できます。今日(today)から6ヶ月前の日付を取得する例です。
using System;
public class AddMonthsPastExample
{
public static void Main()
{
// 基準日: 2025年11月13日 (仮定)
DateTime today = new DateTime(2025, 11, 13);
int monthsToSubtract = -6;
// 6ヶ月前を計算
DateTime sixMonthsAgo = today.AddMonths(monthsToSubtract);
Console.WriteLine($"今日の日付: {today:yyyy/MM/dd}");
Console.WriteLine($"6ヶ月前の日付: {sixMonthsAgo:yyyy/MM/dd}");
}
}
出力結果:
今日の日付: 2025/11/13
6ヶ月前の日付: 2025/05/13
AddMonthsの重要な注意点:月末日の自動調整
AddMonthsがAddDaysと大きく異なる点は、計算結果の月に該当する日が存在しない場合、その月の最終日に自動的に調整(丸め)されることです。
例えば、「10月31日」に「1ヶ月」を足した場合、11月31日は存在しません。この場合、AddMonthsは計算結果を11月30日(11月の最終日)として返します。
コード例:月末の自動調整
「1月31日」に1ヶ月を足した場合、うるう年でなければ「2月28日」になります。
using System;
public class EndOfMonthExample
{
public static void Main()
{
// 1. 月末日 (10月31日) のケース
DateTime date1 = new DateTime(2025, 10, 31);
// 10月31日 + 1ヶ月 -> 11月31日? -> 11月30日 になる
DateTime result1 = date1.AddMonths(1);
Console.WriteLine($"10月31日 の 1ヶ月後: {result1:yyyy/MM/dd}");
// 2. うるう年ではない2月 (1月31日) のケース
DateTime date2 = new DateTime(2025, 1, 31); // 2025年は平年
// 1月31日 + 1ヶ月 -> 2月31日? -> 2月28日 になる
DateTime result2 = date2.AddMonths(1);
Console.WriteLine($"1月31日 の 1ヶ月後 (2025年): {result2:yyyy/MM/dd}");
}
}
出力結果:
10月31日 の 1ヶ月後: 2025/11/30
1月31日 の 1ヶ月後 (2025年): 2025/02/28
この自動調整機能は、月末の応当日を考慮する必要がある場合に非常に便利ですが、意図しない日付になる可能性もあるため、AddMonthsを使用する際は常にこの動作を意識する必要があります。
まとめ
DateTime.AddMonths(int months)は、C#で月単位の日付計算(Nヶ月後・Nヶ月前)を行うための標準的なメソッドです。
- 正の数で未来を、負の数で過去の月を計算できます。
DateTimeの不変性により、常に新しいDateTimeオブジェクトが返されます。- 最大の特徴として、計算結果の月に該当する日が存在しない場合、その月の最終日に自動的に調整されます。
