以下の内容はhttps://nainaistar.hatenablog.com/entry/stat-date-and-cancel-month-compute-cancel-dateより取得しました。


開始日と解約"月"を元に暦上で日割のない解約"日"を求める(Java)

小ネタ。「今年の12月に解約したい。日割りが必要ない日付を教えてほしい」といった、解約する「年月」までは把握しているが、解約する「年月日」までは分からないといったケースに対応するロジックをJavaで求めます。

環境

  • Java
    • 17

対応

暦上の1ヵ月の定義については、こちらの記事を見てください。

雑に表現すると次のどちらかです。

  • 開始日の"日" -1日
  • 月末

月末はYearMonth型を使用すると非常に楽ですので、まずは「解約月」をYearMonth型に変換します。

YearMonth#isValidDayにて、指定日付が存在するかをチェックできます。YearMonth#atDayにて、指定の日付のLocalDate型に変換できます。それぞれのパラメータに「開始日の日-1日」を渡します。もし指定日付が存在すれば、その日付が「解約日」となります。存在しなければ、「解約日」は月末です。

public LocalDate from年月to日割りなし日付(LocalDate startDate, LocalDate endMonth) {
  YearMonth yearMonth = YearMonth.from(endMonth);
  if (yearMonth.isValidDay(localDate.getDayOfMonth() - 1)) {
    return yearMonth.atDay(localDate.getDayOfMonth() - 1);
  } else {
    return yearMonth.atEndOfMonth();
  }
}

なお、存在しない日付とは次のケースです。

  • 開始日が1日
    • パラメータが0日になるため
  • 存在しない日付
    • 2月30日 等々 閏年も含む

ソースコード

テストケースはこの記事参照してください。

終わりに

テストケースさえ思いつけばシンプルです。

LocalDateのまま処理するとチェックメソッドがないため、DateTimeExceptionが発生していたのですが、YearMonth#isValidDayのおかげで安全に処理できました。

地味な内容ですが、検証することでYearMonth#isValidDayの存在に気づけて良かったです。

類似情報




以上の内容はhttps://nainaistar.hatenablog.com/entry/stat-date-and-cancel-month-compute-cancel-dateより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14