如何在纯 Java 8 中获取给定日历周的所有周日期列表?

Mat*_*ulc 2 java-8 java-time

很多 例子可以说明如何使用Joda-Time和旧的java.util.Calendar / java.util.Date API来完成类似的事情,但是没有完整的例子说明如何使用纯java.time API来实现它,没有任何额外的依赖。

还有很多例子,如何为给定的两个日期生成日期。但是我无法找到如何为给定年份和日历周数生成一周日期的完整示例。

您能否提供一个在纯Java 8 / java.time API中执行此操作的示例?

Mat*_*ulc 5

纯 Java 8 / java.time 解决方案

public static List<LocalDate> datesListOfCalendarWeek(int year, long calendarWeek) {
    LocalDate start = LocalDate.ofYearDay(year,1)
            .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, calendarWeek)
            .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));

    return IntStream.range(0, 7).mapToObj(start::plusDays).collect(toList());
}
Run Code Online (Sandbox Code Playgroud)

与 Joda-Time 解决方案比较:

public static List<org.joda.time.LocalDate> datesListOfCalendarWeek(int year, int calendarWeek) {
    org.joda.time.LocalDate start = new org.joda.time.LocalDate(year,1,1)
            .withWeekOfWeekyear(calendarWeek).withDayOfWeek(1);
    return IntStream.range(0, 7).mapToObj(start::plusDays).collect(toList());
}
Run Code Online (Sandbox Code Playgroud)

显然,对于任何给定的 LocalDate,解决方案如下所示:

/* Pure Java 8 / java.time */
public static List<LocalDate> datesListOfCalendarWeek(LocalDate date) {
    LocalDate start = date.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
    return IntStream.range(0, 7).mapToObj(start::plusDays).collect(toList());
}

/* Joda-Time */
public static List<org.joda.time.LocalDate> datesListOfCalendarWeek(org.joda.time.LocalDate date) {
    org.joda.time.LocalDate start = date.withDayOfWeek(1);
    return IntStream.range(0, 7).mapToObj(start::plusDays).collect(toList());
}
Run Code Online (Sandbox Code Playgroud)