我需要以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
在此先感謝!
我需要以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
在此先感謝!
最簡單的答案是使用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
類型的變量。如果你看到了,通常有更好的方法。
直接權威。感謝您的指導! –
@JodaStephen,它仍然輸出2015-01-15 – StasKolodyuk
@JodaStephen,它應該是.parseDefaulting(ChronoField.HOUR_OF_DAY,24) – StasKolodyuk
好像我找到了一個靈魂。那就是:
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());
您爲什麼認爲結果必須是2015-01-16?很明顯,你對不存在的時鐘時間應該是什麼樣的情況(對於所有輸入字符串總是相同的?)做出一個不可思議的假設。對我而言,日期正如解析:2015-01-15。 UTC沒有連接,因爲缺少時間部分。 –