Java : TemporalAdjusters (日時の調整ユーティリティ) - API使用例
TemporalAdjusters (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
一般的かつ有用なTemporalAdjustersです。
TemporalAdjusters は、用途別の TemporalAdjuster を返すユーティリティクラスです。
例えば、月の最終日に調整する TemporalAdjuster は、lastDayOfMonth() メソッドで取得します。
final var adjuster = TemporalAdjusters.lastDayOfMonth();
final var date1 = LocalDate.of(2021, 1, 1);
System.out.println(date1); // 2021-01-01
System.out.println(date1.with(adjuster)); // 2021-01-31
final var date2 = LocalDate.of(2021, 2, 1);
System.out.println(date2); // 2021-02-01
System.out.println(date2.with(adjuster)); // 2021-02-28
// うるう年
final var date3 = LocalDate.of(2020, 2, 1);
System.out.println(date3); // 2020-02-01
System.out.println(date3.with(adjuster)); // 2020-02-29
// 日時もOKです。
final var dateTime = LocalDateTime.of(2021, 4, 2, 12, 30);
System.out.println(dateTime); // 2021-04-02T12:30
System.out.println(dateTime.with(adjuster)); // 2021-04-30T12:30
メソッド
static TemporalAdjuster dayOfWeekInMonth (int ordinal, DayOfWeek dayOfWeek)
月のスターで曜日を返します。月のスターでは、その月に基づいて序数の曜日が返されます。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 1);
System.out.println(date.format(formatter)); // 2021年12月01日(水)
{
final var ret1 = date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.WEDNESDAY));
System.out.println(ret1.format(formatter)); // 2021年12月01日(水)
final var ret2 = date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.THURSDAY));
System.out.println(ret2.format(formatter)); // 2021年12月02日(木)
final var ret3 = date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.FRIDAY));
System.out.println(ret3.format(formatter)); // 2021年12月03日(金)
}
{
final var ret1 = date.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY));
System.out.println(ret1.format(formatter)); // 2021年12月05日(日)
final var ret2 = date.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY));
System.out.println(ret2.format(formatter)); // 2021年12月12日(日)
final var ret3 = date.with(TemporalAdjusters.dayOfWeekInMonth(3, DayOfWeek.SUNDAY));
System.out.println(ret3.format(formatter)); // 2021年12月19日(日)
}
static TemporalAdjuster firstDayOfMonth ()
現在の月の最初の日に設定された新しい日付を返す「月の最初の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.firstDayOfMonth();
final var date1 = LocalDate.of(2021, 1, 15);
System.out.println(date1); // 2021-01-15
System.out.println(date1.with(adjuster)); // 2021-01-01
final var date2 = LocalDate.of(2021, 2, 28);
System.out.println(date2); // 2021-02-28
System.out.println(date2.with(adjuster)); // 2021-02-01
final var date3 = LocalDate.of(1999, 12, 31);
System.out.println(date3); // 1999-12-31
System.out.println(date3.with(adjuster)); // 1999-12-01
static TemporalAdjuster firstDayOfNextMonth ()
翌月の最初の日に設定された新しい日付を返す「翌月の最初の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.firstDayOfNextMonth();
final var date1 = LocalDate.of(2021, 1, 15);
System.out.println(date1); // 2021-01-15
System.out.println(date1.with(adjuster)); // 2021-02-01
final var date2 = LocalDate.of(2021, 2, 28);
System.out.println(date2); // 2021-02-28
System.out.println(date2.with(adjuster)); // 2021-03-01
final var date3 = LocalDate.of(1999, 12, 31);
System.out.println(date3); // 1999-12-31
System.out.println(date3.with(adjuster)); // 2000-01-01
static TemporalAdjuster firstDayOfNextYear ()
翌年の最初の日に設定された新しい日付を返す「翌年の最初の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.firstDayOfNextYear();
final var date1 = LocalDate.of(2021, 1, 15);
System.out.println(date1); // 2021-01-15
System.out.println(date1.with(adjuster)); // 2022-01-01
final var date2 = LocalDate.of(2021, 2, 28);
System.out.println(date2); // 2021-02-28
System.out.println(date2.with(adjuster)); // 2022-01-01
final var date3 = LocalDate.of(1999, 12, 31);
System.out.println(date3); // 1999-12-31
System.out.println(date3.with(adjuster)); // 2000-01-01
static TemporalAdjuster firstDayOfYear ()
現在の年の最初の日に設定された新しい日付を返す「年の最初の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.firstDayOfYear();
final var date1 = LocalDate.of(2021, 1, 15);
System.out.println(date1); // 2021-01-15
System.out.println(date1.with(adjuster)); // 2021-01-01
final var date2 = LocalDate.of(2021, 2, 28);
System.out.println(date2); // 2021-02-28
System.out.println(date2.with(adjuster)); // 2021-01-01
final var date3 = LocalDate.of(1999, 12, 31);
System.out.println(date3); // 1999-12-31
System.out.println(date3.with(adjuster)); // 1999-01-01
static TemporalAdjuster firstInMonth (DayOfWeek dayOfWeek)
一致する最初の曜日を持つ同じ月の新しい日付を返す、月の初出アジャスタを返します。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 1);
System.out.println(date.format(formatter)); // 2021年12月01日(水)
final var ret1 = date.with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年12月06日(月)
final var ret2 = date.with(TemporalAdjusters.firstInMonth(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年12月07日(火)
final var ret3 = date.with(TemporalAdjusters.firstInMonth(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年12月01日(水)
final var ret4 = date.with(TemporalAdjusters.firstInMonth(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年12月02日(木)
final var ret5 = date.with(TemporalAdjusters.firstInMonth(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年12月03日(金)
static TemporalAdjuster lastDayOfMonth ()
現在の月の最後の日に設定された新しい日付を返す「月の最後の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.lastDayOfMonth();
final var date1 = LocalDate.of(2021, 1, 1);
System.out.println(date1); // 2021-01-01
System.out.println(date1.with(adjuster)); // 2021-01-31
final var date2 = LocalDate.of(2021, 2, 15);
System.out.println(date2); // 2021-02-15
System.out.println(date2.with(adjuster)); // 2021-02-28
final var date3 = LocalDate.of(1999, 4, 3);
System.out.println(date3); // 1999-04-03
System.out.println(date3.with(adjuster)); // 1999-04-30
static TemporalAdjuster lastDayOfYear ()
現在の年の最後の日に設定された新しい日付を返す「年の最後の日」アジャスタを返します。
final var adjuster = TemporalAdjusters.lastDayOfYear();
final var date1 = LocalDate.of(2021, 1, 1);
System.out.println(date1); // 2021-01-01
System.out.println(date1.with(adjuster)); // 2021-12-31
final var date2 = LocalDate.of(2021, 2, 15);
System.out.println(date2); // 2021-02-15
System.out.println(date2.with(adjuster)); // 2021-12-31
final var date3 = LocalDate.of(1999, 12, 3);
System.out.println(date3); // 1999-12-03
System.out.println(date3.with(adjuster)); // 1999-12-31
static TemporalAdjuster lastInMonth (DayOfWeek dayOfWeek)
一致する最後の曜日を持つ同じ月の新しい日付を返す、月の最終アジャスタを返します。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 6, 1);
System.out.println(date.format(formatter)); // 2021年06月01日(火)
final var ret1 = date.with(TemporalAdjusters.lastInMonth(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年06月28日(月)
final var ret2 = date.with(TemporalAdjusters.lastInMonth(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年06月29日(火)
final var ret3 = date.with(TemporalAdjusters.lastInMonth(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年06月30日(水)
final var ret4 = date.with(TemporalAdjusters.lastInMonth(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年06月24日(木)
final var ret5 = date.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年06月25日(金)
static TemporalAdjuster next (DayOfWeek dayOfWeek)
調整対象の日付より後で指定された曜日が最初に出現する日に日付を調整する、次の曜日アジャスタを返します。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 15);
System.out.println(date.format(formatter)); // 2021年12月15日(水)
final var ret1 = date.with(TemporalAdjusters.next(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年12月20日(月)
final var ret2 = date.with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年12月21日(火)
final var ret3 = date.with(TemporalAdjusters.next(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年12月22日(水)
final var ret4 = date.with(TemporalAdjusters.next(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年12月16日(木)
final var ret5 = date.with(TemporalAdjusters.next(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年12月17日(金)
static TemporalAdjuster nextOrSame (DayOfWeek dayOfWeek)
調整対象の日付より後で指定された曜日が最初に出現する日に日付を調整する「次の曜日または同日」アジャスタを返します(ただし、日付がすでにその曜日だった場合は同じオブジェクトが返される)。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 15);
System.out.println(date.format(formatter)); // 2021年12月15日(水)
final var ret1 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年12月20日(月)
final var ret2 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年12月21日(火)
final var ret3 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年12月15日(水)
final var ret4 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年12月16日(木)
final var ret5 = date.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年12月17日(金)
static TemporalAdjuster ofDateAdjuster (UnaryOperator<LocalDate> dateBasedAdjuster)
日付アジャスタをラップしたTemporalAdjusterを取得します。
// 2日後に調整する Adjuster です。
final var adjuster = TemporalAdjusters.ofDateAdjuster(date -> date.plusDays(2));
final var date1 = LocalDate.of(2021, 1, 1);
System.out.println(date1); // 2021-01-01
System.out.println(date1.with(adjuster)); // 2021-01-03
final var date2 = LocalDate.of(1999, 12, 31);
System.out.println(date2); // 1999-12-31
System.out.println(date2.with(adjuster)); // 2000-01-02
static TemporalAdjuster previous (DayOfWeek dayOfWeek)
調整対象の日付より前で指定された曜日が最初に出現する日に日付を調整する、前の曜日アジャスタを返します。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 15);
System.out.println(date.format(formatter)); // 2021年12月15日(水)
final var ret1 = date.with(TemporalAdjusters.previous(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年12月13日(月)
final var ret2 = date.with(TemporalAdjusters.previous(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年12月14日(火)
final var ret3 = date.with(TemporalAdjusters.previous(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年12月08日(水)
final var ret4 = date.with(TemporalAdjusters.previous(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年12月09日(木)
final var ret5 = date.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年12月10日(金)
static TemporalAdjuster previousOrSame (DayOfWeek dayOfWeek)
調整対象の日付より前で指定された曜日が最初に出現する日に日付を調整する「前の曜日または同日」アジャスタを返します(ただし、日付がすでにその曜日だった場合は同じオブジェクトが返される)。
final var formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日(E)");
final var date = LocalDate.of(2021, 12, 15);
System.out.println(date.format(formatter)); // 2021年12月15日(水)
final var ret1 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
System.out.println(ret1.format(formatter)); // 2021年12月13日(月)
final var ret2 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.TUESDAY));
System.out.println(ret2.format(formatter)); // 2021年12月14日(火)
final var ret3 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.WEDNESDAY));
System.out.println(ret3.format(formatter)); // 2021年12月15日(水)
final var ret4 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.THURSDAY));
System.out.println(ret4.format(formatter)); // 2021年12月09日(木)
final var ret5 = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.FRIDAY));
System.out.println(ret5.format(formatter)); // 2021年12月10日(金)
関連記事
- 日付・時刻の基本
- Date, CalendarではなくLocalDateTime, ZonedDateTimeを使おう
- 文字列と日付・時刻の変換
- 日時と曜日の計算
- 現在時刻(日時)の取得いろいろ
- 現在の曜日(DayOfWeek)を取得
- ZoneIdとZoneOffsetの違い
- API 使用例
- DateTimeException (日付・時刻の例外)
- DateTimeParseException (日付・時刻の解析例外)
- DayOfWeek (曜日)
- Duration (時間の量)
- LocalDate (日付・タイムゾーンなし)
- LocalDateTime (日時・タイムゾーンなし)
- LocalTime (時刻・タイムゾーンなし)
- Month (月)
- Instant (時点)
- OffsetDateTime (日時・オフセットあり)
- OffsetTime (時刻・オフセットあり)
- Period (日付の量)
- Year (年)
- ZonedDateTime (日時・タイムゾーンあり)
- ZoneId (タイムゾーンID)
- ZoneOffset (タイムゾーン・オフセット)