JavaでLocalDateとLocalDateTimeを元に月末日を求める
年と月のパラメータから月末日を求めるYearMonth型の記事を書きました。しかし、個人的に時刻を扱うときはLocalDate, LocalDateTimeのどちらかで扱いたいです。
今回の記事では、LocalDate, LocalDateTimeを元に月末日を求めます。
環境
- Java
- 15
前提条件
なし。
ゴール
LocalDateから月末日を求めるLocalDateTimeから月末日を求める
月末日を求める
withメソッドとTemporalAdjusters.lastDayOfMonthメソッドを組み合わせます。
withメソッドはパラメータの新しいインスタンスを作成します。例えば、withMonthに1を渡すと、1月のインスタンスが返却されます。withメソッドにTemporalAdjusters.lastDayOfMonthメソッドを指定すると、閏年を考慮した月末日のインスタンスになります。
LocalDateもLocalDateTimeもwithメソッドを持ったTemporalインターフェースを継承していますので、どちらも同様に使うことができます。
// LocalDate @Test void test_01() { assertThat( LocalDate.of(2020, 1, 15).with(TemporalAdjusters.lastDayOfMonth()) ).isEqualTo(LocalDate.of(2020, 1, 31)); } // LocalDateTime @Test void test_05() { assertThat( LocalDateTime.of(2021, 2, 15, 1, 1).with(TemporalAdjusters.lastDayOfMonth()) ).isEqualTo(LocalDateTime.of(2021, 2, 28, 1, 1)); }
インスタンスが月末であることを確認する
+1日した結果、月跨ぎが発生して1日になれば月末とみてよいでしょう。
LocalDate.of(2021, 2, 28).plusDays(1).getDayOfMonth() == 1;
こちらを紹介した理由としては、withメソッドを使うよりは誤差ですが早く済むからです。10億回実行して、最も早く処理をすることができました。認知できない程度の速度差なので、お好きなやり方を使用してください。
- 20ミリ秒
- +1日したら月跨ぎが発生
- 40ミリ秒
- LocalDateTimeでwithメソッドを使う
- 60ミリ秒
- LocalDateでwithメソッドを使う
- 65ミリ秒
- LocalDateをYearMonthにキャストする
ソースコード
テストコード(性能確認も含む): github.com
終わりに
個人的に普段から使う型での月末を求めることができて良かったです。
この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。
