Java 8:在特定日期之后找到第n天DayOfWeek

时间:2017-03-06 07:02:44

标签: java datetime dayofweek localdate

在Java 8中,我找到的是

TemporalAdjuster temporal = dayOfWeekInMonth(1,DayOfWeek.MONDAY) 

给出了一个月的第一个星期一的时间,

next(DayOfWeek.MONDAY)

在特定日期之后的下一个星期一。

但我希望在具体日期之后找到第n个星期一。

例如,我想在2017-06-06之后的第二个星期一,它应该是2017-06-19

dayOfWeekInMonth(2,DayOfWeek.MONDAY)

会给我2017-06-12和

next(DayOfWeek.MONDAY) 

当然没有第n个DayOfWeek指标的参数。它将给出下一个2017-06-12的第一个星期一。

如何在不循环的情况下计算它?

1 个答案:

答案 0 :(得分:4)

编写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
}