2016-01-15 66 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());