gpt4 book ai didi

java - 解析日期时无法从 TemporalAccessor 获取 ZonedDateTime

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:39 25 4
gpt4 key购买 nike

使用 Java 1.8.0_51 以下代码(取自 Unable to obtain OffsetDateTime from TemporalAccessor)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime offsetDateTime = ZonedDateTime.parse("20151113", formatter).toOffsetDateTime();
System.out.println(offsetDateTime.format(DateTimeFormatter.ISO_DATE));

抛出异常:

java.time.format.DateTimeParseException: Text '20151113' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO,Europe/Berlin resolved to 2015-11-13 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)

这次我做错了什么?

最佳答案

您忘记设置时间了。

如果比较my answer使用您的代码,您会注意到唯一的区别是缺少时间信息。 ZonedDateTime 包含时间信息,由于您当前的格式化程序不处理它,因此无法形成 ZonedDateTime 的实例。

您还可以在堆栈跟踪中看到它,其中包含

Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {},ISO,Europe/Berlin resolved to 2015-11-13 of type java.time.format.Parsed
at java.time.LocalTime.from(LocalTime.java:409)
at java.time.ZonedDateTime.from(ZonedDateTime.java:560)
... 5 more

根据您的需要,您可以使用 DateTimeFormatterBuilder 构建自定义格式化程序并调用parseDefaulting为每个时间计时字段提供默认值。如果你想默认为午夜,你可以设置NANO_OF_DAY到 0。一个示例是

public static void main(String[] args) {
DateTimeFormatter formatter =
new DateTimeFormatterBuilder().appendPattern("yyyyMMdd")
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.toFormatter()
.withZone(ZoneId.of("Europe/Berlin"));

OffsetDateTime offsetDateTime = ZonedDateTime.parse("20151113", formatter).toOffsetDateTime();
System.out.println(offsetDateTime.format(DateTimeFormatter.ISO_DATE));
}

另一种可能的解决方案是将文本解析为 LocalDate,然后用它构造一个 ZoneDateTime:

public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate parsed = LocalDate.parse("20151113", formatter);
ZonedDateTime zonedDateTime = ZonedDateTime.of(parsed, LocalTime.MIDNIGHT, ZoneId.of("Europe/Berlin"));
// get OffsetDateTime similarly
}

关于java - 解析日期时无法从 TemporalAccessor 获取 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35944270/

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