きり丸の技術日記

技術検証したり、資格等をここに残していきます。

JavaでLocalDateとLocalDateTimeを元に月末日を求める

年と月のパラメータから月末日を求めるYearMonth型の記事を書きました。しかし、個人的に時刻を扱うときはLocalDate, LocalDateTimeのどちらかで扱いたいです。

今回の記事では、LocalDate, LocalDateTimeを元に月末日を求めます。

環境

  • Java
    • 15

前提条件

なし。

ゴール

  • LocalDateから月末日を求める
  • LocalDateTimeから月末日を求める

月末日を求める

withメソッドとTemporalAdjusters.lastDayOfMonthメソッドを組み合わせます。

withメソッドはパラメータの新しいインスタンスを作成します。例えば、withMonthに1を渡すと、1月のインスタンスが返却されます。withメソッドにTemporalAdjusters.lastDayOfMonthメソッドを指定すると、閏年を考慮した月末日のインスタンスになります。

LocalDateLocalDateTimewithメソッドを持った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億回実行して、最も早く処理をすることができました。認知できない程度の速度差なので、お好きなやり方を使用してください。

  1. 20ミリ秒
    • +1日したら月跨ぎが発生
  2. 40ミリ秒
    • LocalDateTimeでwithメソッドを使う
  3. 60ミリ秒
    • LocalDateでwithメソッドを使う
  4. 65ミリ秒
    • LocalDateをYearMonthにキャストする

ソースコード

テストコード(性能確認も含む): github.com

終わりに

個人的に普段から使う型での月末を求めることができて良かったです。


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

f:id:nainaistar:20210512181109p:plain