DateTimeで特定の月の末日を求める方法について。

§1 方法1 DateTime.DaysInMonthを使う

DateTime.DaysInMonthメソッドを使って目的の月の日数を取得してDateTimeインスタンスを作成する。

using System;

class Sample {
  // DaysInMonthメソッドを使って末日を求めるメソッド
  static DateTime GetLastDayOf(int year, int month)
  {
    // year年month月の一ヶ月間の日数を求める
    int lastDay = DateTime.DaysInMonth(year, month);

    // 末日のインスタンスを作成
    DateTime lastDayOfMonth = new DateTime(year, month, lastDay);

    return lastDayOfMonth;
  }

  static void Main()
  {
    //2012年1月〜12月の各月の末尾を求める
    for (int month = 1; month <= 12; month++) {
      Console.WriteLine(GetLastDayOf(2012, month));
    }
  }
}
実行結果
2012/01/31 0:00:00
2012/02/29 0:00:00
2012/03/31 0:00:00
2012/04/30 0:00:00
2012/05/31 0:00:00
2012/06/30 0:00:00
2012/07/31 0:00:00
2012/08/31 0:00:00
2012/09/30 0:00:00
2012/10/31 0:00:00
2012/11/30 0:00:00
2012/12/31 0:00:00

§2 方法2 翌月頭の日付から1日引く

一旦次の月の1日の日付を求め、そこから1日引くことで目的の月の末日を求める。

using System;

class Sample {
  // 日付の加減算によって末日を求めるメソッド
  static DateTime GetLastDayOf(int year, int month)
  {
    // 翌月1日の日付を求める
    DateTime firstDayOfNextMonth = new DateTime(year, month, 1);

    firstDayOfNextMonth = firstDayOfNextMonth.AddMonths(1);

    // さらにそこから1日引いたものを求める
    DateTime lastDayOfMonth = firstDayOfNextMonth.AddDays(-1);

    return lastDayOfMonth;
  }

  static void Main()
  {
    //2012年1月〜12月の各月の末尾を求める
    for (int month = 1; month <= 12; month++) {
      Console.WriteLine(GetLastDayOf(2012, month));
    }
  }
}
出力例
2012/01/31 0:00:00
2012/02/29 0:00:00
2012/03/31 0:00:00
2012/04/30 0:00:00
2012/05/31 0:00:00
2012/06/30 0:00:00
2012/07/31 0:00:00
2012/08/31 0:00:00
2012/09/30 0:00:00
2012/10/31 0:00:00
2012/11/30 0:00:00
2012/12/31 0:00:00