Java 8: найти nth DayOfWeek после определенного дня месяца

В Java 8 я нашел

TemporalAdjuster temporal = dayOfWeekInMonth(1,DayOfWeek.MONDAY) 

дает временное значение для первого понедельника месяца и

next(DayOfWeek.MONDAY)

дает следующий понедельник после определенной даты.

Но я хочу найти n-й ПОНЕДЕЛЬНИК после определенной даты.

Например, я хочу 2-й ПОНЕДЕЛЬНИК после 2017-06-06, и это должно быть 2017-06-19, где

dayOfWeekInMonth(2,DayOfWeek.MONDAY)

даст мне 2017-06-12 и

next(DayOfWeek.MONDAY) 

конечно, не имеет параметра для индикатора n-го дня недели. Это даст следующий первый ПОНЕДЕЛЬНИК, который будет 2017-06-12.

Как я могу вычислить это без цикла?


person Mahbub Rahman    schedule 06.03.2017    source источник


Ответы (1)


Напишите реализацию TemporalAdjuster интерфейс.

Найдите следующий понедельник, затем добавьте (N - 1) недель:

public static TemporalAdjuster nextNthDayOfWeek(int n, DayOfWeek dayOfWeek) {
    return temporal -> {
        Temporal next = temporal.with(TemporalAdjusters.next(dayOfWeek));
        return next.plus(n - 1, ChronoUnit.WEEKS);
    };
}

Передайте свой объект TemporalAdjuster в LocalDate.with. Получите еще LocalDate с желаемым результатом.

public static void main(String[] args) {
    LocalDate date = LocalDate.of(2017, 3, 7);
    date = date.with(nextNthDayOfWeek(2, DayOfWeek.MONDAY));
    System.out.println("date = " + date); // prints 2017-03-20
} 
person JB Nizet    schedule 06.03.2017
comment
Большое спасибо за это хорошее решение! - person Mahbub Rahman; 06.03.2017