解析ISO_INSTANT和类似的日期时间字符串

我昨天创造了这个精彩的静态方法 ,它工作得很好 – 昨天

但是,今天它给了我这个错误。 我想这是从Z之前的太多0。

任何人都可以推荐如何以简洁的方式(Java 8)解析这种类型的String格式日期 – 请记住它昨天也有效,所以ISO_INSTANT也是String的有效格式?

 Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed at java.time.LocalDate.from(LocalDate.java:368) at java.time.LocalDateTime.from(LocalDateTime.java:456) ... 9 more 

输入时间抛出exception:“2015-09-28T14:46:44.000000Z”

 /** * * @param time the time in RFC3339 format (eg "2013-07-03T14:30:38Z" ) * @return */ public static LocalDateTime parseTimeINSTANT(String time) { DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; return LocalDateTime.from(f.parse(time)); } 

在此处输入图像描述

您正在解析与ISO即时一致的String,因此您需要将结果存储在Instant而不是LocalDateTime

 public static Instant parseTimeINSTANT(String time) { DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); } 

请注意,此格式化程序正确处理小数秒,因此您无需删除它们。 引用DateTimeFormatter.ISO_INSTANT Javadoc(强调我的):

解析时,至少需要秒时间字段。 解析从零到九的小数秒

至于为什么它昨天而不是今天工作,我不知道……

只是为了帮助任何人以后看到这个问题。

您需要将ISO Date解析为Instant ,将其转换为Instant Object,然后从中创建一个LocalDateTime ,提供区域Id。 我在这里设置UTC的区域ID。

代码如下

 public static LocalDateTime getISODate(String dateString) { DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); return date; }