2016-01-15 63 views
8

我需要以UTC格式解析字符串2015-01-15-05:00 LocalDate(或smth else)。 的问题是,下面的代码:Java 8偏移日期解析

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE)); 

输出2015-01-15忽略的偏移。期望的输出是2015-01-16

在此先感谢!

+1

您为什么认为结果必须是2015-01-16?很明显,你对不存在的时钟时间应该是什么样的情况(对于所有输入字符串总是相同的?)做出一个不可思议的假设。对我而言,日期正如解析:2015-01-15。 UTC没有连接,因为缺少时间部分。 –

回答

7

最简单的答案是使用OffsetDateTime来表示数据,但是你需要默认时间:

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .append(DateTimeFormatter.ISO_OFFSET_DATE) 
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
    .toFormatter(); 
OffsetDateTime dt = OffsetDateTime.parse("2015-01-15-05:00", fmt); 
LocalDate date = dt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDate(); 

ZonedDateTime是有用的,如果与时区交易,但是当你只处理补偿,OffsetDateTime更简单。

通常,应用程序代码不应包含TemporalAccessor类型的变量。如果你看到了,通常有更好的方法。

+2

直接权威。感谢您的指导! –

+0

@JodaStephen,它仍然输出2015-01-15 – StasKolodyuk

+0

@JodaStephen,它应该是.parseDefaulting(ChronoField.HOUR_OF_DAY,24) – StasKolodyuk

2

好像我找到了一个灵魂。那就是:

TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_OFFSET_DATE.parse("2015-01-15-05:00"); 
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.from(temporalAccessor), LocalTime.MAX, ZoneId.from(temporalAccessor)); 
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate());