Получите неделю и год в прошлом, используя LocalDate - PullRequest
4 голосов
/ 22 января 2020

Я использую библиотеку времени Java 8, чтобы определить предыдущие недели и год от сегодняшней даты, а затем сохранить эти значения на карте. Я думаю, что я понял, как правильно получить недели, но я не совсем уверен, как правильно получить год. Текущий код ниже:

int weeksLimit = 5; // this value is passed into the method, but just setting it here as an example
Map<Integer, Integer> yearWeeks = new HashMap<Integer, Integer>();
LocalDate ld = LocalDate.now();
WeekFields weekFields = WeekFields.of(DayOfWeek.SUNDAY, 4);
for (int i = weeksLimit; i > 0; i--) {
    LocalDate pastDate = ld.minusWeeks(i);
    yearWeeks.put(pastDate.getYear(), pastDate.get(weekFields.weekOfWeekBasedYear()));
}

Я не верю, pastDate.getYear() - правильное использование. В результате я хочу получить что-то вроде:

  • 1/12/2020 - 1/18/2020 = неделя 3, год 2020
  • 1/05/2020 - 1/11/2020 = неделя 2, год 2020
  • 12/29/2019 - 1/04/2020 = неделя 1, год 2020
  • 12/22/2019 - 12/28 / 2019 = неделя 52, год 2019

Может кто-нибудь помочь мне понять, как правильно получить желаемый год?

1 Ответ

5 голосов
/ 22 января 2020

Я не могу сказать, какая структура данных подходит для ваших целей. Карта с ключом года и значением недели не подходит для хранения данных вашего примера. В вашем примере 2020 год наступает три раза, но данный ключ может появляться на карте только один раз. В следующем примере я предполагаю карту, которая отображает каждую неделю на основе года в список номеров недель для этого года.

    WeekFields weekFields = WeekFields.of(Locale.forLanguageTag("mt_MT"));

    int weeksLimit = 5; // this value is passed into the method, but just setting it here as an example

    LocalDate today = LocalDate.now(ZoneId.of("Europe/Malta"));
    Map<Integer, List<Integer>> yearWeeks = IntStream.rangeClosed(1, weeksLimit)
            .mapToObj(i -> today.minusWeeks(i))
            .collect(Collectors.groupingBy(ld -> ld.get(weekFields.weekBasedYear()),
                    Collectors.mapping(ld -> ld.get(weekFields.weekOfWeekBasedYear()),
                            Collectors.toList())));

    System.out.println(yearWeeks);

Когда я только что запустил фрагмент, выходные данные было:

{2019 = [52, 51], 2020 = = [3, 2, 1]}

Я не ожидаю там еще, но Я не буду прилагать больше усилий, пока не пойму ваши требования более четко.

...