【问题标题】:Get Week and Year in Past Using LocalDate使用 LocalDate 获取过去的周和年
【发布时间】:2020-05-09 00:05:57
【问题描述】:

我正在使用 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 = 2020 年第 3 周
  • 1/05/2020 - 1/11/2020 = 2020 年第 2 周
  • 12/29/2019 - 1/04/2020 = 2020 年第 1 周
  • 12/22/2019 - 12/28/2019 = 2019 年第 52 周

有人可以帮我弄清楚如何正确获得我想要的年份吗?

【问题讨论】:

  • (1) 您可能想要基于周的年份而不是年份。 (2) 您不能将这些值放在以年为键、以周为值的地图中。在您的示例中,2020 年出现了 3 次,但给定的键在地图中只能出现一次。
  • 我认为马耳他可能是世界上唯一使用WeekFields.of(DayOfWeek.SUNDAY, 4)的国家。如果你想要这个是因为它是马耳他语,WeekFields.of(Locale.forLanguageTag("mt_MT")) 可能会更好地传达这一点。
  • 每周的第一天和最后一天是否需要部分结果,还是只需要年份和周数?

标签: java time java-8 week-number temporal


【解决方案1】:

我不知道哪种数据结构适合您的目的。以年为键、以周为值的地图不适用于保存您的示例数据。在您的示例中,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);

刚才运行sn-p的时候,输出是:

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

我不希望到那里,但在我更清楚地了解您的要求之前,我不会在这方面投入更多精力。

【讨论】:

  • 谢谢!是的,这是我正在寻找的正确解决方案。在使用 weekBasedYear() 方法以及不适合我需要的单个地图方面,您是正确的。我个人最终使用 apache.commons.collections4.MultiValuedMap 只是为了稍微减少所需的代码行数,但最终它与您在此处描述的解决方案相同。
  • 感谢您的反馈!很高兴这很有帮助。是的,MultiValiedMap 听起来不错。
猜你喜欢
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多