Javaで特定の曜日を取得する方法!過去や未来の日付も簡単操作
生徒
「Javaで来週の金曜日や、先週の月曜日みたいに、特定の曜日を取得することってできますか?」
先生
「もちろんできますよ。JavaのTemporalAdjustersクラスを使えば、過去や未来の任意の曜日を簡単に取得できます。」
生徒
「曜日を指定して日付を取れるなんて便利ですね!どんな風に使うんですか?」
先生
「それでは、実際にLocalDateやTemporalAdjustersの使い方を見ながら解説していきましょう。」
1. Javaで曜日を取得する基本の考え方
Javaでは、日付操作にLocalDateクラスやDayOfWeek列挙型、そしてTemporalAdjustersユーティリティを組み合わせて使うことで、「次の金曜日」や「前の月曜日」といった特定の曜日の日付を取得できます。
日付・曜日操作は、スケジュール管理・予約システム・カレンダーアプリなどの開発でよく使われる機能です。
2. 今週・来週の特定の曜日を取得する方法
現在の日付から「次の月曜日」や「次の金曜日」を取得するには、TemporalAdjusters.next()を使います。JavaのDayOfWeek列挙型と組み合わせて記述します。
import java.time.LocalDate;
import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;
public class NextWeekdayExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate nextMonday = today.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
LocalDate nextFriday = today.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println("次の月曜日: " + nextMonday);
System.out.println("次の金曜日: " + nextFriday);
}
}
次の月曜日: 2025-09-08
次の金曜日: 2025-09-05
上記のように、with(TemporalAdjusters.next(...))で「次に来る指定の曜日」が取得できます。
3. 過去の曜日(前の月曜・金曜など)を取得する方法
過去の曜日を取得したい場合は、TemporalAdjusters.previous()を使います。これは「直前の指定曜日」を返してくれます。
import java.time.LocalDate;
import java.time.DayOfWeek;
import java.time.temporal.TemporalAdjusters;
public class PreviousWeekdayExample {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate lastMonday = today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
LocalDate lastFriday = today.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
System.out.println("前の月曜日: " + lastMonday);
System.out.println("前の金曜日: " + lastFriday);
}
}
前の月曜日: 2025-09-01
前の金曜日: 2025-08-29
TemporalAdjusters.previous()を使うことで、過去の特定の曜日に簡単にさかのぼることができます。
4. 同じ曜日を含めたいときは「orSame」系を使う
現在が金曜日だった場合に「次の金曜日」を取得すると、1週間後の金曜日になります。もし「今日が金曜日ならそれを使いたい」と思うなら、nextOrSame()やpreviousOrSame()を使います。
LocalDate today = LocalDate.now();
LocalDate thisOrNextFriday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
LocalDate thisOrLastMonday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
orSameを使うことで、「今日がその曜日なら今日、それ以外なら次(または前)」という柔軟な制御が可能になります。
5. 毎週特定の曜日の繰り返し処理をしたい場合
たとえば、今週から4週間にわたって毎週火曜日の処理を行いたいときは、ループとplusWeeks()を組み合わせます。
LocalDate firstTuesday = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
for (int i = 0; i < 4; i++) {
LocalDate targetDate = firstTuesday.plusWeeks(i);
System.out.println("対象日: " + targetDate);
}
対象日: 2025-09-02
対象日: 2025-09-09
対象日: 2025-09-16
対象日: 2025-09-23
このように繰り返し処理にも応用できます。plusWeeks()を使えば週単位での繰り返しも簡単です。
6. 特定の月の最初や最後の指定曜日を取得したいとき
月初の金曜日や、月末の火曜日を取得したい場合はTemporalAdjusters.firstInMonth()やlastInMonth()を使います。
LocalDate now = LocalDate.now();
LocalDate firstFriday = now.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY));
LocalDate lastTuesday = now.with(TemporalAdjusters.lastInMonth(DayOfWeek.TUESDAY));
System.out.println("月初の金曜日: " + firstFriday);
System.out.println("月末の火曜日: " + lastTuesday);
月初の金曜日: 2025-09-05
月末の火曜日: 2025-09-30
月単位のスケジュールを作成する際に非常に役立つ方法です。
7. DayOfWeek列挙型の使い方と注意点
DayOfWeekは、曜日を表す列挙型(enum)で、MONDAY〜SUNDAYまでが用意されています。
大文字で指定する必要があるため、間違えて"monday"などと書かないように注意しましょう。
DayOfWeek day = DayOfWeek.MONDAY;
System.out.println(day); // MONDAY
フォームやユーザー入力から文字列で受け取った場合にはDayOfWeek.valueOf()で変換します。
8. TemporalAdjustersが使える他の便利な操作
TemporalAdjustersには他にも以下のような便利なメソッドがあります:
firstDayOfMonth():月初の日付lastDayOfMonth():月末の日付firstDayOfNextMonth():次の月の初日firstInMonth(DayOfWeek):月の最初の指定曜日
これらを組み合わせることで、柔軟な日付操作が可能になります。Javaでカレンダーを扱う場面では、こうした日付調整処理は非常に重宝されます。