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