日時

月末の日付を取得

西暦年と月を指定して月末の日付を求めます。

年と月によって最終日が違います。例えば、閏年うるうどし)の2月の場合は29日、閏年でない場合は28日です。また、1月は31日、4月は30日のように月によっても違います。

Calenderクラスを使うことで、最終日を簡単に求めることができるので、その方法を紹介します。

方法は以下の通りです。

①Calendarクラスに、西暦年と月と1日を設定します。(月の初日を設定)

②初日を設定したCalendarに1ヶ月を足します。

③Calendarから1日を引きます。

これで、Calenderに指定西暦年と月の最終日の日付が格納されます。

Javaソースコード

以下は、Calendarクラスを使ったJavaソースコード例です。

2000年から2002年の全ての月の月末の日付を出力します。

EndOfTheMonth.java

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
import java.util.Calendar;

public class EndOfTheMonth {
	public static void main( String[] args ) {
		// Calendarクラスのインスタンス生成
		Calendar calendar = Calendar.getInstance();

		// 西暦年を2000-2002
		for ( int year = 2000; year <= 2002; ++ year ) {
			// 月を1-12
			for ( int month = 1; month <= 12; month ++ ) {
				// 西暦年と月と1日を設定
				calendar.set( year, month - 1, 1 );

				// 1ヶ月を足す
				calendar.add( Calendar.MONTH, 1 );

				// 1日を引く
				calendar.add( Calendar.DAY_OF_MONTH, -1 );

				// 年月日を変数に代入
				int y = calendar.get( Calendar.YEAR );
				int m = calendar.get( Calendar.MONTH ) + 1;
				int d = calendar.get( Calendar.DAY_OF_MONTH );

				// 結果をコンソール出力
				System.out.println( y + "/" + m + "/" + d );
			}
		}
	}
}

出力結果

2000/1/31
2000/2/29
2000/3/31
2000/4/30
2000/5/31
2000/6/30
2000/7/31
2000/8/31
2000/9/30
2000/10/31
2000/11/30
2000/12/31
2001/1/31
2001/2/28
2001/3/31
2001/4/30
2001/5/31
2001/6/30
2001/7/31
2001/8/31
2001/9/30
2001/10/31
2001/11/30
2001/12/31
2002/1/31
2002/2/28
2002/3/31
2002/4/30
2002/5/31
2002/6/30
2002/7/31
2002/8/31
2002/9/30
2002/10/31
2002/11/30
2002/12/31

正しく月末の日付が出力されています。

閏年(うるうどし)である2000年の2月の月末が"2000/2/29"、閏年でない2001年の2月の月末が"2001/2/28"となっています。

Javaソースコードの解説

001
import java.util.Calendar;

「java.util」パッケージにあるCalendarクラスを使うための記述です。 この記述により、Calenderクラスが利用できるようになります。

003
public class EndOfTheMonth {

クラス名を、EndOfTheMonthとしています。

004
	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

005
006
		// Calendarクラスのインスタンス生成
		Calendar calendar = Calendar.getInstance();

デフォルトのロケール、タイムゾーンを持つCalendarオブジェクトcalendarを生成します。

Calendar.getInstanceメソッド

public static Calendar getInstance()
・デフォルトのタイムゾーンおよびロケールを使用してカレンダを取得

  パラメータ なし

  戻り値     デフォルトロケールを持つデフォルトタイムゾーンの現在時刻に基づいたCalendar
008
009
		// 西暦年を2000-2002
		for ( int year = 2000; year <= 2002; ++ year ) {

for文で、西暦年を格納するint型変数yearを2000から2001まで1ずつ変化させています。

010
011
			// 月を1-12
			for ( int month = 1; month <= 12; month ++ ) {

for文で、月を格納するint型変数monthを1から12まで1ずつ変化させています。

012
013
				// 西暦年と月と1日を設定
				calendar.set( year, month - 1, 1 );

西暦年year、月monthの初日をCalendarクラスのsetメソッドで設定しています。月にmonth - 1を渡しているのは、setメソッドの仕様で1月は0、2月は1、…12月は11だからです。

Calendar.getInstanceメソッド

void set( int year, int month, int date )
・カレンダ・フィールドYEAR、MONTH、およびDAY_OF_MONTHの値を設定します。

  パラメータ year : 年
        month : 月 (0から始まる。0が1月、11が12月)
        date : 日

  戻り値     なし
015
016
				// 1ヶ月を足す
				calendar.add( Calendar.MONTH, 1 );

addメソッドで、calendarの月に1ヶ月を足しています。

018
019
				// 1日を引く
				calendar.add( Calendar.DAY_OF_MONTH, -1 );

addメソッドで、calendarの日から1日を引いています。

021
022
023
024
				// 年月日を変数に代入
				int y = calendar.get( Calendar.YEAR );
				int m = calendar.get( Calendar.MONTH ) + 1;
				int d = calendar.get( Calendar.DAY_OF_MONTH );

getメソッドで、calendarの年、月、日を取得し、それぞれ整数型の変数y、m、dに代入しています。

026
027
				// 結果をコンソール出力
				System.out.println( y + "/" + m + "/" + d );

変数y、m、dを半角のスラッシュ'/'で区切って、printlnメソッドコンソール出力しています。

関連コンテンツ

処理を繰り返すために使用するfor文について解説しています。

2020.03.23

変数やクラスに格納されている値をコンソール出力する方法は?

2020.03.23

プログラミングで使う変数って何?

2020.03.23

整数型の変数に1を足すインクリメント、1つ引くデクリメントについて詳しく説明しています。

2020.03.23

広告