betacode

Руководство Java TemporalAdjusters

  1. TemporalAdjusters
  2. TemporalAdjusters Methods
  3. ofDateAdjuster(UnaryOperator<LocalDate>)
  4. firstDayOfMonth()
  5. lastDayOfMonth()
  6. firstDayOfNextMonth()
  7. firstDayOfYear()
  8. lastDayOfYear()
  9. firstDayOfNextYear()
  10. firstInMonth(DayOfWeek)
  11. lastInMonth(DayOfWeek)
  12. dayOfWeekInMonth(int, DayOfWeek)
  13. next(DayOfWeek)
  14. nextOrSame(DayOfWeek)
  15. previous(DayOfWeek)
  16. previousOrSame(DayOfWeek)

1. TemporalAdjusters

Класс TemporalAdjusters предоставляет статические методы для получения полезных и распространенных объектов TemporalAdjuster, таких как:
  • Поиск первого или последнего дня месяца.
  • Поиск первого дня следующего месяца.
  • Поиск первого или последнего дня в году.
  • Поиск первого дня следующего года.
  • Поиск первого или последнего "дня недели" (day-of-week) в месяце, например "первая среда июня".
  • Поиск следующего или предыдущего "дня недели" (day-of-week), например "следующего четверга".
См. также статью об интерфейсе TemporalAdjuster с основными примерами и пользовательским TemporalAdjuster:

2. TemporalAdjusters Methods

Все методы, предоставляемые TemporalAdjusters, являются статическими и возвращают объект TemporalAdjuster.
public static TemporalAdjuster ofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster)

public static TemporalAdjuster firstDayOfMonth()  
public static TemporalAdjuster lastDayOfMonth()  

public static TemporalAdjuster firstDayOfNextMonth()  

public static TemporalAdjuster firstDayOfYear()  
public static TemporalAdjuster lastDayOfYear()  

public static TemporalAdjuster firstDayOfNextYear()

public static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)  
public static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)  

public static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)

public static TemporalAdjuster next(DayOfWeek dayOfWeek)   
public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek)  

public static TemporalAdjuster previous(DayOfWeek dayOfWeek)   
public static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek)

3. ofDateAdjuster(UnaryOperator<LocalDate>)

Этот метод возвращает объект TemporalAdjuster для настройки части LocalDate объекта Temporal. Другие части объекта Temporal остаются неизменными.
public static TemporalAdjuster ofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster) {
    Objects.requireNonNull(dateBasedAdjuster, "dateBasedAdjuster");
    return (temporal) -> {
        LocalDate input = LocalDate.from(temporal);
        LocalDate output = dateBasedAdjuster.apply(input);
        return temporal.with(output);
    };
}
Например, добавление 2 дней к объекту Temporal:
Temporal
Example
After 2 days
ZonedDateTime
2020-05-25T13:30:59+6[Asia/Bishkek]
2020-05-27T13:30:59+6[Asia/Bishkek]
OffsetDateTime
2020-05-25T13:30:59+6
2020-05-27T13:30:59+6
LocalDateTime
2020-05-25T13:30:59
2020-05-27T13:30:59
Например: TemporalAdjuster для добавления 2 дней.
TemporalAdjusters_ofDateAdjuster_ex1.java
package org.o7planning.temporaladjusters.ex;

import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

public class TemporalAdjusters_ofDateAdjuster_ex1 {
    public static void main(String[] args) {
        TemporalAdjuster add2DaysAdjuster = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(2));
        
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        ZonedDateTime after2Days = zonedDateTime.with(add2DaysAdjuster);
        
        System.out.println("zonedDateTime: " + zonedDateTime);
        System.out.println("after2Days: " + after2Days);
    }
}
Output:
zonedDateTime: 2021-07-05T18:53:19.138987+06:00[Asia/Bishkek]
after2Days: 2021-07-07T18:53:19.138987+06:00[Asia/Bishkek]
  • Руководство Java UnaryOperator

4. firstDayOfMonth()

Возвращает TemporalAdjuster - "первый день месяца"
public static TemporalAdjuster firstDayOfMonth()
Например:
TemporalAdjusters_firstDayOfMonth_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfMonth = (LocalDate) TemporalAdjusters.firstDayOfMonth().adjustInto(localDate);
System.out.println("firstDayOfMonth: " + firstDayOfMonth);

DayOfWeek dayOfWeek = firstDayOfMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:
today is: 2021-07-05
firstDayOfMonth: 2021-07-01
 > day of week: THURSDAY
  • Руководство Java DayOfWeek

5. lastDayOfMonth()

Возвращает TemporalAdjuster - "последний день месяца".
public static TemporalAdjuster lastDayOfMonth()
Например:
TemporalAdjusters_lastDayOfMonth_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate lastDayOfMonth = (LocalDate) TemporalAdjusters.lastDayOfMonth().adjustInto(localDate);
System.out.println("lastDayOfMonth: " + lastDayOfMonth);

DayOfWeek dayOfWeek = lastDayOfMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:
today is: 2021-07-05
lastDayOfMonth: 2021-07-31
 > day of week: SATURDAY
  • Руководство Java DayOfWeek

6. firstDayOfNextMonth()

Возвращает TemporalAdjuster - "первый день следующего месяца".
public static TemporalAdjuster firstDayOfNextMonth()
Например:
TemporalAdjusters_firstDayOfNextMonth_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfNextMonth = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfNextMonth());
System.out.println("firstDayOfNextMonth: " + firstDayOfNextMonth);

DayOfWeek dayOfWeek = firstDayOfNextMonth.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);

int dayOfMonth = firstDayOfNextMonth.getDayOfMonth();
System.out.println(" > day of month: " + dayOfMonth);
Output:
today is: 2021-07-05
firstDayOfNextMonth: 2021-08-01
 > day of week: SUNDAY
 > day of month: 1

7. firstDayOfYear()

Возвращает TemporalAdjuster - "первый день года".
public static TemporalAdjuster firstDayOfYear()
Например:
TemporalAdjusters_firstDayOfYear_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfYear = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfYear());
System.out.println("firstDayOfYear: " + firstDayOfYear);

DayOfWeek dayOfWeek = firstDayOfYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:
today is: 2021-07-05
firstDayOfYear: 2021-01-01
 > day of week: FRIDAY

8. lastDayOfYear()

Возвращает TemporalAdjuster - "последний день года".
public static TemporalAdjuster lastDayOfYear()
Например:
TemporalAdjusters_lastDayOfYear_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate lastDayOfYear = (LocalDate) localDate.with(TemporalAdjusters.lastDayOfYear());
System.out.println("lastDayOfYear: " + lastDayOfYear);

DayOfWeek dayOfWeek = lastDayOfYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);
Output:
today is: 2021-07-05
lastDayOfYear: 2021-12-31
 > day of week: FRIDAY

9. firstDayOfNextYear()

Возвращает TemporalAdjuster - "первый день следующего года".
public static TemporalAdjuster firstDayOfNextYear()
Например:
TemporalAdjusters_firstDayOfNextYear_ex1.java
LocalDate localDate = LocalDate.now();
System.out.println("today is: " + localDate);

LocalDate firstDayOfNextYear = (LocalDate) localDate.with(TemporalAdjusters.firstDayOfNextYear());
System.out.println("firstDayOfNextYear: " + firstDayOfNextYear);

DayOfWeek dayOfWeek = firstDayOfNextYear.getDayOfWeek();
System.out.println(" > day of week: " + dayOfWeek);

int dayOfYear = firstDayOfNextYear.getDayOfYear();
System.out.println(" > day of year: " + dayOfYear);
Output:
today is: 2021-07-05
firstDayOfNextYear: 2022-01-01
> day of week: SATURDAY
> day of year: 1

10. firstInMonth(DayOfWeek)

Возвращает TemporalAdjuster - "Первый день недели месяца (day-of-week)". Например, найдите первый понедельник (MONDAY) месяца.
public static TemporalAdjuster firstInMonth(DayOfWeek dayOfWeek)
В настоящее время в США дата начала DST - второе воскресенье марта, а дата конца - первое воскресенье ноября. Вопрос состоит в том, когда в США начнется день начала 2025 года?
TemporalAdjusters_firstInMonth_ex1.java
// Find the first SUNDAY in month.
TemporalAdjuster adjuster1 = TemporalAdjusters.firstInMonth(DayOfWeek.SUNDAY);
// Find the next SUNDAY
TemporalAdjuster adjuster2 = TemporalAdjusters.next(DayOfWeek.SUNDAY);

LocalDate localDate = LocalDate.of(2025, 3, 1); // 2025-03-01

LocalDate firstSundayInMonth = (LocalDate) localDate.with(adjuster1);
LocalDate secondSundayInMonth = (LocalDate) firstSundayInMonth.with(adjuster2);

System.out.println("firstSaturdayInMonth: " + firstSundayInMonth); // 2025-03-02
System.out.println("secondSundayInMonth: " + secondSundayInMonth);  // 2025-03-09

11. lastInMonth(DayOfWeek)

Возвращает TemporalAdjuster - "Последний день недели месяца (day-of-week) ". Например, найдите последний понедельник (MONDAY) месяца.
public static TemporalAdjuster lastInMonth(DayOfWeek dayOfWeek)
Например: Найдите последнее воскресенье текущего месяца:
TemporalAdjusters_lastInMonth_ex1.java
// Find the last SUNDAY in month.
TemporalAdjuster adjuster = TemporalAdjusters.lastInMonth(DayOfWeek.SUNDAY);  

LocalDate localDate = LocalDate.now();
System.out.println("Today is: " + localDate);

LocalDate lastSundayInMonth = (LocalDate) localDate.with(adjuster);  
System.out.println("lastSundayInMonth: " + lastSundayInMonth);
Output:
Today is: 2021-07-05
lastSundayInMonth: 2021-07-25

12. dayOfWeekInMonth(int, DayOfWeek)

Возвращает TemporalAdjuster - "ordinal день недели месяца (day-of-week)". Например, найдите 3-й понедельник (MONDAY) месяца.
public static TemporalAdjuster dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
Например: Найдите второе вокресенье (SUNDAY) марта 2025 года (дата начала DST 2025 года в США).
TemporalAdjusters_dayOfWeekInMonth_ex1.java
// Find the second SUNDAY in month.
TemporalAdjuster adjuster = TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY);  

LocalDate localDate = LocalDate.of(2025, 3, 1); // 2025-03-01
 
LocalDate secondSundayInMonth = (LocalDate) localDate.with(adjuster);   
System.out.println("secondSundayInMonth: " + secondSundayInMonth);  // 2025-03-09

13. next(DayOfWeek)

Возвращает TemporalAdjuster - "следующий день недели (day-of-week)". Например, найдите следующий понедельник (MONDAY).
public static TemporalAdjuster next(DayOfWeek dayOfWeek)
Например: Найдите следующий понедельник (MONDAY).
TemporalAdjusters_next_ex1.java
// Find the next MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.next(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Next MONDAY.
LocalDate nextMonday = localDate.with(adjuster);
 
System.out.println("nextMonday: " + nextMonday);  // 2021-07-12
System.out.println("nextMonday.getDayOfWeek(): " + nextMonday.getDayOfWeek());  // MONDAY
Output:
localDate: 2021-07-05
localDate.getDayOfWeek(): MONDAY
nextMonday: 2021-07-12
nextMonday.getDayOfWeek(): MONDAY

14. nextOrSame(DayOfWeek)

Возвращает TemporalAdjuster - "тот же день или следующий день недели (day-of-week)".
public static TemporalAdjuster nextOrSame(DayOfWeek dayOfWeek)
Например: Возвращает эту дату, если это понедельник, в противном случае возвращает следующий понедельник.
TemporalAdjusters_nextOrSame_ex1.java
// Find the next or same MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Next or same MONDAY.
LocalDate nextOrSameMonday = localDate.with(adjuster);
 
System.out.println("nextOrSameMonday: " + nextOrSameMonday);  // 2021-07-05
System.out.println("nextOrSameMonday.getDayOfWeek(): " + nextOrSameMonday.getDayOfWeek());  // MONDAY

15. previous(DayOfWeek)

Возвращает TemporalAdjuster - "предыдущий день недели (day-of-week)". Например, найдите предыдущий понедельник (MONDAY).
public static TemporalAdjuster previous(DayOfWeek dayOfWeek)
Например: Найдите предыдущий понедельник (MONDAY).
TemporalAdjusters_previous_ex1.java
// Find the previous MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.previous(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Previous MONDAY.
LocalDate previousMonday = localDate.with(adjuster);
 
System.out.println("previousMonday: " + previousMonday);  // 2021-06-28
System.out.println("previousMonday.getDayOfWeek(): " + previousMonday.getDayOfWeek());  // MONDAY
Output:
localDate: 2021-07-05
localDate.getDayOfWeek(): MONDAY
previousMonday: 2021-06-28
previousMonday.getDayOfWeek(): MONDAY

16. previousOrSame(DayOfWeek)

Возвращает TemporalAdjuster - "тот же или предыдущий день недели (day-of-week)".
public static TemporalAdjuster previousOrSame(DayOfWeek dayOfWeek)
Например: Возвращает эту дату, если это понедельник, в противном случае возвращает предыдущий понедельник.
TemporalAdjusters_previousOrSame_ex1.java
// Find the previous or same MONDAY
TemporalAdjuster adjuster = TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY);  

LocalDate localDate = LocalDate.of(2021, 7, 5); // 2021-07-05
System.out.println("localDate: " + localDate);  // 2021-07-05
System.out.println("localDate.getDayOfWeek(): " + localDate.getDayOfWeek());  // MONDAY
 
// Previous or same MONDAY.
LocalDate previousOrSameMonday = localDate.with(adjuster);
 
System.out.println("previousOrSameMonday: " + previousOrSameMonday);  // 2021-07-05
System.out.println("previousOrSameMonday.getDayOfWeek(): " + previousOrSameMonday.getDayOfWeek());  // MONDAY