Javaで「月末日(月の最終日)」を求めたい場面は、業務システムでは非常によくあります。たとえば請求締め処理、月次バッチ、経費計算、月末日のチェックロジックなど、多くの処理で「今月の最終日」を正確に取得することが必要です。
この記事では、LocalDate や TemporalAdjusters を使った一般的な方法に加えて、YearMonth、lengthOfMonth() を利用した実務的でシンプルな書き方も紹介します。あわせて「最終営業日の取得」など、現場でよく求められる実用テクニックも補足しています。
LocalDate型の月末日の取得方法
Javaソース
- LocalDate型で月末日を取得するにはwithメソッドの引数に「TemporalAdjusters.lastDayOfMonth()」を指定します。
1234567891011121314import java.time.LocalDate;import java.time.temporal.TemporalAdjusters;public class LocalDateSample {public static void main(String[] args) {// LocalDateの月末日を取得LocalDate targetDate = LocalDate.of(2020, 2, 1);LocalDate result = targetDate.with(TemporalAdjusters.lastDayOfMonth());System.out.println("LocalDate.with(TemporalAdjusters.lastDayOfMonth()) = " + result);}}
コンソール
Calendar型の月末日の取得方法
Javaソース
- Calenar型で月末日を取得するにはgetActualMaximumメソッドを使用します。
1234567891011121314import java.util.Calendar;public class LocalDateSample {public static void main(String[] args) {// Calendarの月末日を取得Calendar cal = Calendar.getInstance();cal.clear();cal.set(2020, 1, 1); // 2020-2-1int result2 = cal.getActualMaximum(Calendar.DATE);System.out.println("Calendar.getActualMaximum(Calendar.DATE) = " + result2);}}
コンソール
補足:YearMonth や lengthOfMonth() を使った別解、実務で使える応用例
月末日を取得する方法は TemporalAdjusters.lastDayOfMonth() が最も定番ですが、実務では他の書き方が役立つ場面も多いです。ここでは追加のテクニックとしていくつか紹介します。
■ YearMonth を使う書き方(コードがシンプルで読みやすい)
YearMonth は「年+月」を扱うクラスのため、月末日を取得するだけなら一番読みやすい方法 です。
■ lengthOfMonth() + withDayOfMonth() を使う別解
lengthOfMonth() でその月の日数を取得 → withDayOfMonth() に渡すだけで月末日になります。
■ “月の最終営業日(平日ベース)” を取得したいケース
金融系や締め処理では「月末が土日なら前の平日を採用する」ケースがあります。
■ ZonedDateTime / LocalDateTime と組み合わせる場合の注意
時間やタイムゾーン付きの日時 (ZonedDateTime / LocalDateTime) から 日付だけ月末に進めたい場合 は、一度 toLocalDate() で取り出してから加工します。
LocalDate と違い、日時型は「時刻」や「タイムゾーン」の概念があるため、月末ロジックを適用するときは型をしっかり意識しましょう。


