2015-09-28 31 views
6

我昨天创造了这个奇妙的静态方法,和它的工作就好了 - 昨天解析ISO_INSTANT和类似的日期时间字符串

然而,今天,它给了我这个错误。我猜这是从Z前的太多0开始的。

任何人都可以推荐如何以简明的方式解析这种类型的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 

投掷输入时间异常: “2015-09-28T14:46:44.000000Z”

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

enter image description here

+0

ISO_INSTANT不支持时区,可以固定类似: 'Instant.from(DateTimeFormatter.ISO_DATE_TIME.parse(“2017-04-20T00:00: 00 + 04:00“))' –

回答

11

您解析字符串是与ISO一致的瞬间因此您需要将结果存储在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(强调我的):

解析时,至少需要time字段的时间。 从零到秒的分数秒被解析

至于为什么昨天和今天没有它的工作,我不知道......

+0

谢谢,可以做'LocalDateTime.from(即时);'?我的代码真的在期待LocalDateTime格式。纳秒不重要 – ycomp

+2

@ycomp您可以将Instant转换为LocalDateTime,请参阅[本答案](http://stackoverflow.com/a/19726814/1743880)。 – Tunaki

+0

也许我昨天刚刚编码,认为我跑了它,但直到今天从来没有跑过它 - 我看不到任何代码,表明我可以昨天运行它..所以我想它从来没有真正的工作方式我最初编码它 – ycomp

3

只是为了帮助后面的人看到了这个问题的缘故。

您需要将ISO日期解析为Instant,将其转换为Instant对象,然后从中创建一个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; 
}