連載
» 2007年07月05日 05時00分 公開

.NET TIPS:n日後、nカ月後、n年後の日付を求めるには?[C#、VB]

[遠藤孝信,デジタルアドバンテージ]
「.NET TIPS」のインデックス

連載目次

 .NET Frameworkでは、特定の日付はDateTime構造体(System名前空間)のインスタンスとして表すことができるが、その日付から、指定した日数、月数、年数が経過したときの日付はDateTime構造体の以下の3つのメソッドで求めることができる。

  • n日後の日付 : AddDays(n)
  • nカ月後の日付 : AddMonths(n)
  • n年後の日付 : AddYears(n)

 これらのメソッドは日付に対して日、月、年の加算を行うが、減算を行うためのメソッドは用意されていない。このため、n日前、nカ月前、n年前の日付を求めるには、これらのメソッドのパラメータで負の数を指定して行う。

 以下に、これらのメソッドを利用したサンプル・プログラムを示す。

// adddays.cs

using System;

class AddDaysMonthsYears {
  static void Main() {

    DateTime theday = new DateTime(2007, 12, 31);
    Console.WriteLine(theday); // 出力:2007/12/31 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddDays(n);
      Console.WriteLine("{0}日後 {1}", n, newday);
    }
    // 出力:
    // 1日後 2008/01/01 0:00:00
    // 2日後 2008/01/02 0:00:00
    // 3日後 2008/01/03 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddDays(-n);
      Console.WriteLine("{0}日前 {1}", n, newday);
    }
    // 出力:
    // 1日前 2007/12/30 0:00:00
    // 2日前 2007/12/29 0:00:00
    // 3日前 2007/12/28 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddMonths(n);
      Console.WriteLine("{0}カ月後 {1}", n, newday);
    }
    // 出力:
    // 1カ月後 2008/01/31 0:00:00
    // 2カ月後 2008/02/29 0:00:00
    // 3カ月後 2008/03/31 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddMonths(-n);
      Console.WriteLine("{0}カ月前 {1}", n, newday);
    }
    // 出力:
    // 1カ月前 2007/11/30 0:00:00
    // 2カ月前 2007/10/31 0:00:00
    // 3カ月前 2007/09/30 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddYears(n);
      Console.WriteLine("{0}年後 {1}", n, newday);
    }
    // 出力:
    // 1年後 2008/12/31 0:00:00
    // 2年後 2009/12/31 0:00:00
    // 3年後 2010/12/31 0:00:00

    for (int n = 1; n <= 3; n++) {
      DateTime newday = theday.AddYears(-n);
      Console.WriteLine("{0}年前 {1}", n, newday);
    }
    // 出力:
    // 1年前 2006/12/31 0:00:00
    // 2年前 2005/12/31 0:00:00
    // 3年前 2004/12/31 0:00:00
  }
}

// コンパイル方法:csc adddays.cs

特定の日付に日、月、年の加算を行うC#のサンプル・プログラム(adddays.cs)
adddays.csのダウンロード

' adddays.vb

Imports System

Class AddDaysMonthsYears
  Shared Sub Main()

    Dim theday As New DateTime(2007, 12, 31)
    Console.WriteLine(theday) ' 出力:2007/12/31 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddDays(n)
      Console.WriteLine("{0}日後 {1}", n, newday)
    Next
    ' 出力:
    ' 1日後 2008/01/01 0:00:00
    ' 2日後 2008/01/02 0:00:00
    ' 3日後 2008/01/03 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddDays(-n)
      Console.WriteLine("{0}日前 {1}", n, newday)
    Next
    ' 出力:
    ' 1日前 2007/12/30 0:00:00
    ' 2日前 2007/12/29 0:00:00
    ' 3日前 2007/12/28 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddMonths(n)
      Console.WriteLine("{0}カ月後 {1}", n, newday)
    Next
    ' 出力:
    ' 1カ月後 2008/01/31 0:00:00
    ' 2カ月後 2008/02/29 0:00:00
    ' 3カ月後 2008/03/31 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddMonths(-n)
      Console.WriteLine("{0}カ月前 {1}", n, newday)
    Next
    ' 出力:
    ' 1カ月前 2007/11/30 0:00:00
    ' 2カ月前 2007/10/31 0:00:00
    ' 3カ月前 2007/09/30 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddYears(n)
      Console.WriteLine("{0}年後 {1}", n, newday)
    Next
    ' 出力:
    ' 1年後 2008/12/31 0:00:00
    ' 2年後 2009/12/31 0:00:00
    ' 3年後 2010/12/31 0:00:00

    For n As Integer = 1 To 3
      Dim newday As DateTime = theday.AddYears(-n)
      Console.WriteLine("{0}年前 {1}", n, newday)
    Next
    ' 出力:
    ' 1年前 2006/12/31 0:00:00
    ' 2年前 2005/12/31 0:00:00
    ' 3年前 2004/12/31 0:00:00
  End Sub
End Class

' コンパイル方法:vbc adddays.vb

特定の日付に日、月、年の加算を行うVBのサンプル・プログラム(adddays.vb)
adddays.vbのダウンロード

 ここで少し注意すべきは、「2007/12/31」の2カ月後が「2008/02/29」、1カ月前が「2007/11/30」といったように、「日」の部分がずれる点だ。この結果からも分かるように、AddMonthsメソッドは、nカ月を加算した月に、該当する日付が含まれていない場合にはその月の月末の日付を返す。

カテゴリ:クラス・ライブラリ 処理対象:日付と時刻
使用ライブラリ:DateTime構造体(System名前空間)


「.NET TIPS」のインデックス

.NET TIPS

Copyright© 1999-2018 Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。