首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非ISO 8601解析为ISO_INSTANT

将非ISO 8601解析为ISO_INSTANT
EN

Stack Overflow用户
提问于 2020-05-21 14:12:23
回答 2查看 602关注 0票数 2

我正在尝试将这个字符串2020-05-20 14:27:00.943000000 +00:00和这个Wed May 20 14:27:00 CEST 2020解析为一个ISO_INSTANT,但是总是返回这个异常

代码语言:javascript
复制
java.time.format.DateTimeParseException: Text '2020-05-20 14:27:00.943000000 +00:00' could not be parsed at index 10

我的代码是:

代码语言:javascript
复制
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; }

如何转换此类型?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-21 15:55:51

tl;dr

代码语言:javascript
复制
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替换日期和时间之间的空格。删除时间和偏移量之间的空间。

代码语言:javascript
复制
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的形式解析,在偏移世界协调系统的上下文中有一天的时间的日期.

代码语言:javascript
复制
OffsetDateTime odt = OffsetDateTime.parse( modifiedInput ) ;

或者,定义格式模式以匹配输入字符串。使用DateTimeFormatter类。这已经在Stack溢出上讨论了很多次了,所以搜索来了解更多。

您尝试使用的预定义格式化程序DateTimeFormatter.ISO_INSTANT与输入不匹配。您的输入不符合该格式化程序使用的ISO 8601标准。

代码语言:javascript
复制
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 ) ;

看这个在IdeOne.com现场运行的代码

odt.toString():2020-05-20T14:27:00.943Z

如果您需要返回一个Instant,请调用toInstant

代码语言:javascript
复制
Instant instant = odt.toInstant() ;

若要在时区上下文中查看同一时刻,请应用ZoneId获取ZonedDateTime对象。

代码语言:javascript
复制
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

OffsetDateTimeZonedDateTime对象在时间轴上表示相同的时刻,相同的点。

票数 4
EN

Stack Overflow用户

发布于 2020-05-21 15:43:04

导致异常的原因是字符串2020-05-20 14:27:00.943000000 +00:00ISO_INSTANT格式不同;从DateTimeFormatter开始,ISO_INSTANT接受像2011-12-03T10:15:30Z这样的字符串,而这不是您的情况。解决此问题的一个可能的解决方案是使用自定义DateTimeFormatter,如下所示:

代码语言:javascript
复制
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.943Z
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61936487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档