Как получить список всех дат недели для данной календарной недели в чистой Java 8?

Есть множество примеры того, насколько похожими могут быть вещи сделано с использованием Joda-Time и старых API java.util.Calendar/java.util.Date, но нет полных примеров того, как это может быть достигнуто с использованием чистого API java.time без каких-либо дополнительных зависимостей.

Есть также много примеров, как генерировать даты для заданных двух дат. Но мне не удалось найти полный пример того, как генерировать даты недели для данного года и номера календарной недели.

Не могли бы вы привести пример того, как это делается в чистом API Java 8/java.time?


person Mateusz Szulc    schedule 24.08.2015    source источник


Ответы (1)


Чистая 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());
}

Сравните с решением 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());
}

И, очевидно, для любой заданной 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());
}
person Mateusz Szulc    schedule 24.08.2015
comment
Константу 7 можно заменить на Period.ofWeeks(1).getDays() - person Tagir Valeev; 25.08.2015