「駑馬十駕」を信念に IT系情報を中心に調べた事をコツコツ綴っています。

Javaで「月末日(月の最終日)」を求めたい場面は、業務システムでは非常によくあります。たとえば請求締め処理、月次バッチ、経費計算、月末日のチェックロジックなど、多くの処理で「今月の最終日」を正確に取得することが必要です。

この記事では、LocalDateTemporalAdjusters を使った一般的な方法に加えて、YearMonthlengthOfMonth() を利用した実務的でシンプルな書き方も紹介します。あわせて「最終営業日の取得」など、現場でよく求められる実用テクニックも補足しています。

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 ym = YearMonth.of(2025, 12);
LocalDate lastDay = ym.atEndOfMonth();
System.out.println(lastDay); // → 2025-12-31

YearMonth は「年+月」を扱うクラスのため、月末日を取得するだけなら一番読みやすい方法 です。


■ lengthOfMonth() + withDayOfMonth() を使う別解

LocalDate date = LocalDate.of(2025, 2, 15);
LocalDate last = date.withDayOfMonth(date.lengthOfMonth());
System.out.println(last); // → 2025-02-28

lengthOfMonth() でその月の日数を取得 → withDayOfMonth() に渡すだけで月末日になります。


■ “月の最終営業日(平日ベース)” を取得したいケース

金融系や締め処理では「月末が土日なら前の平日を採用する」ケースがあります。

LocalDate date = LocalDate.of(2025, 3, 10);

LocalDate end = date.with(TemporalAdjusters.lastDayOfMonth());
DayOfWeek dow = end.getDayOfWeek();

if (dow == DayOfWeek.SATURDAY) {
    end = end.minusDays(1); // 金曜日へ
} else if (dow == DayOfWeek.SUNDAY) {
    end = end.minusDays(2); // 金曜日へ
}

System.out.println(end); // 実務向けの“最終営業日”

■ ZonedDateTime / LocalDateTime と組み合わせる場合の注意

時間やタイムゾーン付きの日時 (ZonedDateTime / LocalDateTime) から 日付だけ月末に進めたい場合 は、一度 toLocalDate() で取り出してから加工します。

ZonedDateTime zdt = ZonedDateTime.now();
LocalDate last = zdt.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());

LocalDate と違い、日時型は「時刻」や「タイムゾーン」の概念があるため、月末ロジックを適用するときは型をしっかり意識しましょう。

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る

Ads by Google

0 0
Article Rating
申し込む
注目する
guest
0 コメント一覧
最も古い
最新 高評価
インラインフィードバック
すべてのコメントを見る
0
あなたの考えが大好きです、コメントしてください。x