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

方法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));
    }
  }
}
Imports System

Class Sample
  ' DaysInMonthメソッドを使って末日を求めるメソッド
  Shared Function GetLastDayOf(ByVal year As Integer, ByVal month As Integer) As DateTime
    ' year年month月の一ヶ月間の日数を求める
    Dim lastDay As Integer = DateTime.DaysInMonth(year, month)

    ' 末日のインスタンスを作成
    Dim lastDayOfMonth As New DateTime(year, month, lastDay)

    Return lastDayOfMonth
  End Function

  Shared Sub Main()
    ' 2012年1月〜12月の各月の末尾を求める
    For month As Integer = 1 To 12
      Console.WriteLine(GetLastDayOf(2012, month))
    Next
  End Sub
End Class
実行結果
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 翌月頭の日付から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));
    }
  }
}
Imports System

Class Sample
  ' 日付の加減算によって末日を求めるメソッド
  Shared Function GetLastDayOf(ByVal year As Integer, ByVal month As Integer) As DateTime
    ' 翌月1日の日付を求める
    Dim firstDayOfNextMonth As New DateTime(year, month, 1)

    firstDayOfNextMonth = firstDayOfNextMonth.AddMonths(1)

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

    Return lastDayOfMonth
  End Function

  Shared Sub Main()
    ' 2012年1月〜12月の各月の末尾を求める
    For month As Integer = 1 To 12
      Console.WriteLine(GetLastDayOf(2012, month))
    Next
  End Sub
End Class
出力例
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