年と月のパラメータから月末日を求める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でのシェアや、今後も情報発信しますのでフォローよろしくお願いします。