我正在尝试将这个字符串2020-05-20 14:27:00.943000000 +00:00和这个Wed May 20 14:27:00 CEST 2020解析为一个ISO_INSTANT,但是总是返回这个异常
java.time.format.DateTimeParseException: Text '2020-05-20 14:27:00.943000000 +00:00' could not be parsed at index 10我的代码是:
protected Instant parseDateTime(String fechaHora) {
DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
TemporalAccessor temporalAccessor = formatter.parse(fechaHora);
LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
Instant result = Instant.from(zonedDateTime);
return result; }如何转换此类型?
发布于 2020-05-21 15:55:51
tl;dr
OffsetDateTime.parse(
"2020-05-20 14:27:00.943000000 +00:00" ,
DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss.SSSSSSSSS xxx" )
)
.toInstant()修正你的代码
您的代码在一些方面存在缺陷。
在这里使用TemporalAccessor是不必要的,也是不适当的。引用它的Javadoc的话:
这个接口是一个框架级的接口,不应该在应用程序代码中广泛使用.相反,应用程序应该创建和传递具体类型的实例。
LocalDateTime在这里是不合适的,因为它剥离重要的信息,时区或抵消-世界协调时.
您指定了格式化模式与输入不匹配的格式化程序。
解决方案
操作输入字符串以符合标准ISO 8601格式。用T替换日期和时间之间的空格。删除时间和偏移量之间的空间。
String input = "2020-05-20 14:27:00.943000000 +00:00" ;
String[] strings = input.split( " " ) ;
String modifiedInput = strings[0] + "T" + strings[1] + strings[2] ;以OffsetDateTime的形式解析,在偏移世界协调系统的上下文中有一天的时间的日期.
OffsetDateTime odt = OffsetDateTime.parse( modifiedInput ) ;或者,定义格式模式以匹配输入字符串。使用DateTimeFormatter类。这已经在Stack溢出上讨论了很多次了,所以搜索来了解更多。
您尝试使用的预定义格式化程序DateTimeFormatter.ISO_INSTANT与输入不匹配。您的输入不符合该格式化程序使用的ISO 8601标准。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm:ss.SSSSSSSSS xxx" ) ;
String input = "2020-05-20 14:27:00.943000000 +00:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input , f ) ;odt.toString():2020-05-20T14:27:00.943Z
如果您需要返回一个Instant,请调用toInstant。
Instant instant = odt.toInstant() ;若要在时区上下文中查看同一时刻,请应用ZoneId获取ZonedDateTime对象。
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;OffsetDateTime和ZonedDateTime对象在时间轴上表示相同的时刻,相同的点。
发布于 2020-05-21 15:43:04
导致异常的原因是字符串2020-05-20 14:27:00.943000000 +00:00和ISO_INSTANT格式不同;从DateTimeFormatter开始,ISO_INSTANT接受像2011-12-03T10:15:30Z这样的字符串,而这不是您的情况。解决此问题的一个可能的解决方案是使用自定义DateTimeFormatter,如下所示:
String fechaHora = "2020-05-20 14:27:00.943000000 +00:00";
DateTimeFormatter formatter =DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSSSS ZZZZZ");
TemporalAccessor temporalAccessor = formatter.parse(fechaHora);
LocalDateTime localDateTime = LocalDateTime.from(temporalAccessor);
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.systemDefault());
Instant result = Instant.from(zonedDateTime);
System.out.println(result); //<-- it will print 2020-05-20T12:27:00.943Zhttps://stackoverflow.com/questions/61936487
复制相似问题