2016-11-09 14 views
1

これをGoogleで検索すると、私は多くの回答に出くわしました。xsd:dateをLocalDateに解析する正しい方法

JavaでLocalDateあらゆるxsd:dateを解析する正しい方法は何ですか?ここで

は、私は(グーグルから)が出ている方法があります。

DatatypeFactory.newInstance() 
    .newXMLGregorianCalendar(str) 
    .toGregorianCalendar() 
    .toZonedDateTime() 
    .toLocalDate() 

別:

DatatypeConverter.parseDate(str) 
    .toInstant() 
    .atZone(ZoneId.systemDefault()) 
    .toLocalDate() 

それとも、私は完全に異なる何かをすべきか?

+0

これは役に立ちますか? http://stackoverflow.com/questions/7519800/apache-axis-calendar-instance-that-gets-serialized-to-0001-01-01t000000-000z – kaqqao

+0

@kaqqao - 私はそうは思わない... – Cheetah

答えて

0

はありません、正しくLocalDateあらゆるxsd:dateを変換に方法はありません。

xsd:dateにはタイムゾーンがあり、LocalDateにはタイムゾーンがないためです。したがって、のいずれかではないxsd:dateであるか、または変換が完全にでないかのいずれかが正しくあります。

XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(str); 
LocalDate localDate = LocalDate.of(cal.getYear(), cal.getMonth(), cal.getDay()); 

は、私がGregorianCalendarZonedDateTime経由でこれを行う回答のカップルを見てきましたが、私は理由を持って理解していない:あなたはタイムゾーンを失うことでOKなら

その後、私はやるだけだろうあなたがタイムゾーンをとにかく失うことになっているならば、この間接。

私はまたXMLGregorianCalendarxsd:dateの字句値にずっと近いので、XMLGregorianCalendarを経由して解析するとCalendar経由DatatypeConverter.parseDateよりも優れていると思います。 LocalDateのために必要なのは年、月、日です。したがって、これらの値の最短経路を選ぶのが妥当です。

+0

だから私の最初の例は、最初に 'ZonedDateTime'に変換されてから' LocalDate'(実際にはZonedDateTimeがLocalDateTimeにカバレッジされていると思われる)にもかかわらず、タイムゾーン情報が失われます。 – Cheetah

+0

@Cheetah 'LocalDate' [時間または時間帯を保存または表示しません](https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html)、期間。もちろん、途中でどのような結果があったとしても、最終的に 'LocalDate'に変換すれば、時間帯は失われます。 – lexicore

+0

私はあなたが言っていることを理解しています。私の質問は実際には間違っています。私の質問は: "私は、どのように最善を促すべきですか? – Cheetah

関連する問題