Javaで「月末日(月の最終日)」を求めたい場面は、業務システムでは非常によくあります。たとえば請求締め処理、月次バッチ、経費計算、月末日のチェックロジックなど、多くの処理で「今月の最終日」を正確に取得することが必要です。
この記事では、LocalDate や TemporalAdjusters を使った一般的な方法に加えて、YearMonth、lengthOfMonth() を利用した実務的でシンプルな書き方も紹介します。あわせて「最終営業日の取得」など、現場でよく求められる実用テクニックも補足しています。
LocalDate型の月末日の取得方法
Javaソース
- LocalDate型で月末日を取得するにはwithメソッドの引数に「TemporalAdjusters.lastDayOfMonth()」を指定します。
import 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メソッドを使用します。
import 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-1 int 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 と違い、日時型は「時刻」や「タイムゾーン」の概念があるため、月末ロジックを適用するときは型をしっかり意識しましょう。


