gpt4 book ai didi

java - 无法从 TemporalAccessor : {}, ISO 获取 ZoneOffset,Europe/Berlin 解析为 java.time.format.Parsed 类型的 2019-12-26

转载 作者:行者123 更新时间:2023-12-01 14:27:57 25 4
gpt4 key购买 nike

我正在尝试将字符串解析为 OffsetDateTime 但出现以下错误:

Unhandled exception.
java.time.format.DateTimeParseException: Text '26122019' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {},ISO,Europe/Berlin resolved to 2019-12-26 of type java.time.format.Parsed

我尝试解析的字符串示例看起来像 26122019,数据库中的值看起来像 2018-08-31

在为这些值编写 JPA 查询时,我在这条路径上遇到了另一个错误 @Param("filterEndDate") OffsetDateTime filterEndDate,

      DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyy").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime fromDate = OffsetDateTime.parse(filterFromDate,formatter);
OffsetDateTime toDate = OffsetDateTime.parse(filterEndDate,formatter);

然后我调整了我的代码

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("ddMMyyyy")
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.toFormatter()
.withZone(ZoneOffset.UTC);

出现以下错误:

Caused by: java.time.DateTimeException: Unable to obtain OffsetDateTime from TemporalAccessor: {InstantSeconds=1577318400},ISO,Z resolved to 2019-12-26T00:00 of type java.time.format.Parsed

-----更新1----

代码

LocalDate fromDate = LocalDate.parse(filterFromDate,DateTimeFormatter.ofPattern("ddMMyyyy"));

错误

java.time.format.DateTimeParseException: Text '2019-12-20' could not be parsed at index 2

最佳答案

我展示了两种方式。

解析成LocalDate并转换

对我来说简单的方法是这样的:

    String filterFromDate = "26122019";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyy");
OffsetDateTime fromDate = LocalDate.parse(filterFromDate, formatter)
.atStartOfDay(ZoneOffset.UTC)
.toOffsetDateTime();
System.out.println(fromDate);

这段代码的输出是:

2019-12-26T00:00Z

由于您的字符串包含日期但没有一天中的时间也没有偏移量,因此我正在解析为 LocalDate。然后我执行到 OffsetDateTime 的转换。

调整你的高级格式化程序来完成这项工作

只需简单调整即可使您尝试的方式生效:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("ddMMyyyy")
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
.toFormatter();
OffsetDateTime fromDate = OffsetDateTime.parse(filterFromDate, formatter);

结果和之前一样。 java.time 区分偏移量和时区。在许多需要时区的地方可以使用偏移量,但这里不行。您对 withZone() 的调用提供了默认时区,但没有默认时差。相反,我使用 .parseDefaulting(ChronoField.OFFSET_SECONDS, 0) 来建立默认偏移量。

关于java - 无法从 TemporalAccessor : {}, ISO 获取 ZoneOffset,Europe/Berlin 解析为 java.time.format.Parsed 类型的 2019-12-26,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59427561/

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