gpt4 book ai didi

java - 获取不受支持的字段 : DayOfMonth while using DateTimeFormatter in Java Spring Boot

转载 作者:行者123 更新时间:2023-12-05 02:39:34 24 4
gpt4 key购买 nike

确切错误:java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:DayOfMonth

下面是我创建的 HashMap,我们可以在其中看到仅存在 3 个月的数据。最终目标是使用当月的最近 12 个月的数据动态创建/更新 MAP。

这 3 个月以外的任何月份的值为 0L。

Map<String, Long> expectedValues = new HashMap<>();
expectedValues.put("2021-06-01", 10L);
expectedValues.put("2021-07-01", 20L);
expectedValues.put("2021-08-01", 30L);

我编写了这个逻辑来检查和填充不存在的月份的 0L。但是在使用 DateTimeFormatter

时出现错误
YearMonth thisMonth = YearMonth.now();
for (int i = 0; i < 12; i++) {
// DateTimeFormatter monthYearFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
DateTimeFormatter monthYearFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
String prevYearMonthStr = thisMonth.minusMonths(i).format(monthYearFormatter);
if (!expectedValues.containsKey(prevYearMonthStr)) {
expectedValues.put(prevYearMonthStr, 0L);
}
}

我们如何解决这个错误。

最佳答案

嗯,YearMonth只有一年和一个月的字段。然后您尝试使用 ISO_LOCAL_DATE_TIME 对其进行格式化格式化程序,它需要 Temporal (在您的情况下为 YearMonth )以支持日期字段。

这显然行不通。

你可以使用 YearMonthatDay方法,它转换 YearMonthLocalDate与指定的日期。接下来,这个LocalDate可以使用预定义的 ISO_LOCAL_DATE 进行格式化格式化程序,等于具有模式字符串 uuuu-MM-dd 的格式化程序.

YearMonth thisMonth = YearMonth.now();
DateTimeFormatter format = DateTimeFormatter.ISO_LOCAL_DATE;
for (int i = 0; i < 12; i++) {
String prev = thisMonth.minusMonths(i).atDay(1).format(format);
if (!expectedValues.containsKey(prev)) {
expectedValues.put(prev, 0L);
}
}

Demo

或者使用 Java 8 特性:

static Map<String, Long> transform(Map<String, Long> expectedValues) {
DateTimeFormatter format = DateTimeFormatter.ISO_LOCAL_DATE;
return Stream.iterate(YearMonth.now(), ym -> ym.minusMonths(1))
.limit(12)
.map(ym -> ym.atDay(1).format(format))
.map(str -> Map.entry(str, expectedValues.getOrDefault(str, 0L)))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}

这是这里发生的事情:

  • Stream::iterate接受一个初始值,即当前月份,然后遍历过去的每个月。
  • limit确保我们有 12 个值,否则我们将有一个无限流。
  • 第一个map转换 YearMonthLocalDate与本月的第一天。然后它使用模式 uuuu-MM-dd 对其进行格式化。 .
  • 第二个map创建一个 Map.Entry以流元素为键,以 expectedValues 中的值作为值 map ,或 0L如果 key 不存在。当然,这两个map调用可以合并。
  • 然后我们收集这些Map.Entry<String, Long>当前包含在流中的元素,到 Map .

Demo

关于java - 获取不受支持的字段 : DayOfMonth while using DateTimeFormatter in Java Spring Boot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69071747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com