【C#】DateTime.AddMonths:Nヶ月後・Nヶ月前を計算する方法と月末の注意点

目次

月単位の日付計算

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の重要な注意点:月末日の自動調整

AddMonthsAddDaysと大きく異なる点は、計算結果の月に該当する日が存在しない場合、その月の最終日に自動的に調整(丸め)されることです。

例えば、「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オブジェクトが返されます
  • 最大の特徴として、計算結果の月に該当する日が存在しない場合、その月の最終日に自動的に調整されます
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次