Создать LocalDate из информации календарной недели - PullRequest
0 голосов
/ 20 февраля 2019

Дано:

  • Год: 2019
  • Номер недели календаря: 1 (== 1-я неделя года)
  • A DayOfWeek: SUNDAY

Необходим:

Преобразование этой информации в объект LocalDate, так что

assertEquals(LocalDate.of(2019,1,6), f(2019,1,SUNDAY))

Что я пробовал

Я не нашел способа с помощью java.time. * Создать дату из информации типа «Воскресенье первой недели календаря в 2019 году».Я обнаружил, что старый класс java.util.Calendar имеет функцию setWeekDate (), которая может быть полезной.Но следующий код вызвал исключение:

    ...
    Calendar c = Calendar.getInstance();
    c.setWeekDate(2019, 1, Calendar.MONDAY);
    c.setTimeZone(TimeZone.getDefault());

    return LocalDate.from(c.toInstant());

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2018-01-08T20:03:55.602Z of type java.time.Instant
at java.time.LocalDate.from(LocalDate.java:379)
at ...

1 Ответ

0 голосов
/ 20 февраля 2019

Проверьте ChronoField или IsoFields для подходящего способа получить неделю для календарной системы, которую вы хотите использовать.LocalDate объект, который используется в качестве «базового» значения, должен иметь недельное значение ожидаемого года.

int year = 2019;
int weekNumber = 1;
LocalDate localDate = LocalDate.of(year, 2, 1)
        .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber)
        .with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());

Выбор первой даты имеет смысл.Использование LocalDate.of(year, 1, 1) даст день, который может принадлежать последней неделе предыдущего года, то же самое относится и к LocalDate.now(), но только для данного периода времени.

LocalDate.of(2017, 1, 1)
    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 26)
    .with(ChronoField.DAY_OF_WEEK, DayOfWeek.SUNDAY.getValue());
// 2016-07-03

LocalDate.of(2017, 1, 1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
// 52

Таким образом, переход с 52 недели на 26даст дату 2016-07-03, потому что дата рассчитывается путем вычитания времени между неделями 52 и 26.

Также см. ответ здесь для получения дополнительной информации о withYear: Неожиданный результат вычисления даты

...