きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

Javaで年と月を元に月末日を求める(YearMonth)

Javaにて年と月から、その年の月末日を求める方法をメモとして残します。

環境

  • Java
    • 15

前提条件

  • パラメータは年と月のみ
    • 「2021-05」等の1つにまとまったパラメータも含む

ゴール

  • 閏年も含めて、月末日を求めることができる

YearMonth型

Java8からjava.time.YearMonthクラスが提供されております。クラス名の通り、YearとMonthを扱います。

インスタンスの生成

複数ありますが、使い勝手のいい2つのメソッドを紹介します。

ofメソッド

// intの年とintのmonthから生成する方法
YearMonth.of(int year, int month);

YearMonth.of(2020, 2);

parseメソッド

デフォルトのDateTimeFormatteryyyy-MMとなっています。(※正確には、年は4桁から10桁まで許容しています)

// Stringの年月から生成する方法
YearMonth.parse(CharSequence text);
YearMonth.parse(CharSequence text, DateTimeFormatter dateTimeFormatter);


YearMonth.parse("2020-02");
YearMonth.parse("202_0-02"); // Java7からの数値表現
YearMonth.parse("2020/02", DateTimeFormatter.of("yyyy/MM"));

月末日を求める方法

atEndOfMonthメソッドを使用します。このメソッドの戻り値が指定した年の月末日のLocalDateクラスとなります。

@Test
void test_01() {
    assertThat(
        YearMonth.of(2020, 1).atEndOfMonth()
    ).isEqualTo(LocalDate.of(2020, 1, 31));
}

もし、日付だけ取得したい場合は、LocalDateクラスのgetDayOfMonthメソッドを呼ぶことで取得することができます。

@Test
void test_01_02() {
    assertThat(
        YearMonth.of(2020, 1).atEndOfMonth().getDayOfMonth()
    ).isEqualTo(31);
}

ソースコード

テストコード: github.com

終わりに

YearMonthクラスは特化しているだけあって意図が分かりやすいですね。

月末日を求める方法は複数あるので、YearMonthクラスを意図的に使うことは少ないかもしれませんが、メソッド名等を直感的に使えます。ぜひこの記事を元に使ってみてください。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

f:id:nainaistar:20210511082344p:plain