gpt4 book ai didi

无法在索引 20 处解析 Java 11 DateTimeParseException

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

我正在尝试将字符串转换为 Java 11 中的 Date 对象。下面的代码给出了异常。尝试了不同的方法,到目前为止没有运气。对解决此错误消息有任何帮助吗?

String date = 'Mon Aug 02 16:33:10 EDT 2021'
OffsetDateTime odt = OffsetDateTime.now( ZoneId.systemDefault() ) ;
DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("E MMM d H:m:s z yyyy").toFormatter().ofLocalizedDateTime(FormatStyle.LONG) .withZone(odt.getOffset());
LocalDateTime localDateTime = LocalDateTime.parse(date, formatter);
System.out.println(localDateTime);
System.out.println(formatter.format(localDateTime));

错误

Exception in thread "main" java.time.format.DateTimeParseException: Text 'Mon Aug 02 16:33:10 EDT 2021' could not be parsed at index 20
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
at java_time_LocalDateTime$parse.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)

最佳答案

好的 IDE 会针对您尝试编译的代码发出警告。例如,Eclipse 警告

The static method ofLocalizedDateTime(FormatStyle) from the type DateTimeFormatter should be accessed in a static way

Java 允许您通过引用表达式访问类的static 成员。尽管如此,还是有强烈的共识,你 should not , 并忽略语言功能。

针对您的具体情况,

new DateTimeFormatterBuilder().appendPattern("E MMM d H:m:s z yyyy")
.toFormatter()
.ofLocalizedDateTime(FormatStyle.LONG)
.withZone(odt.getOffset());

静态DateTimeFormatter#ofLocalizedDate(FormatStyle)在类型为 DateTimeFormatter 的引用表达式 [...].toFormatter() 上调用。您似乎认为它是在实际的 DateTimeFormatter 实例上调用的,但实际上它只是一个 static 方法调用。 .toFormatter() 返回的实例被丢弃。您的代码本质上等同于

new DateTimeFormatterBuilder().appendPattern("E MMM d H:m:s z yyyy")
.toFormatter(); // thrown away

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withZone(odt.getOffset());

换句话说,您的formatter 具有由ofLocalizedDateTime 选择的格式,而不是"E MMM d H:m:s z yyyy"你正在尝试使用。据推测,对于您的默认 Locale,该格式无法解析您的日期字符串。

不清楚您是否打算使用该方法。如果您知 Prop 有适当格式的相应语言环境,则可以跳过您的自定义模式并只使用选定的模式

Locale currentLocale = /* whatever is appropriate */;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(currentLocale);

然后解析你的日期字符串。

否则,完全忽略该方法,只使用您提供的模式和时区构建您的 DateTimeFormatter:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("E MMM d H:m:s z yyyy")
.toFormatter()
.withZone(odt.getOffset());

你可以从 DateTimeFormatter class javadoc 中看出,你的模式字符串

E MMM d H:m:s z yyyy

可以正确解析你的日期字符串

Mon Aug 02 16:33:10 EDT 2021

无关,你确定 LocalDateTime 是你需要的吗?您实际上丢失了原始字符串中的时区信息 (EDT)。此外,提供给 withZoneZoneId 将被忽略以解析为 LocalDateTime

关于无法在索引 20 处解析 Java 11 DateTimeParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62517353/

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