LocalDateとXMLGregorianCalendar間の変換

1. 概要

このクイックチュートリアルでは、_LocalDate_および_XMLGregorianCalendar_について説明し、2つのタイプ間の変換の例を示します。

2. _ XMLGregorianCalendar _

XMLスキーマ標準は、日付をXML形式で指定するための明確なルールを定義しています。 この形式を使用するために、Javaクラス_https://www.baeldung.com/java-gregorian-calendar [XMLGregorianCalendar]、_は、Java 1.5で導入され、https://www.w3.org/の表現です。 TR / xmlschema-2 /#isoformats [W3C XML Schema 1.0日付/時刻データ型]。

3. LocalDate

link:/java-8-date-time-intro[_LocalDate_]インスタンスは、ISO-8601カレンダーシステムのタイムゾーンのない日付を表します。 そのため、たとえば、_LocalDate_は誕生日の保存には適していますが、時間に関連するものには適していません。 Javaはバージョン1.8で_LocalDate_を導入しました。

4. _ LocalDate から XMLGregorianCalendar _へ

最初に、_LocalDate_から_XMLGregorianCalendar_に変換する方法を見ていきます。 _XMLGregorianCalendar_の新しいインスタンスを生成するには、_javax.xml.datatype_パッケージの_DataTypeFactory_を使用します。
それでは、_LocalDate_のインスタンスを作成し、_XMLGregorianCalendar_に変換しましょう。
LocalDate localDate = LocalDate.of(2019, 4, 25);

XMLGregorianCalendar xmlGregorianCalendar =
  DatatypeFactory.newInstance().newXMLGregorianCalendar(localDate.toString());

assertThat(xmlGregorianCalendar.getYear()).isEqualTo(localDate.getYear());
assertThat(xmlGregorianCalendar.getMonth()).isEqualTo(localDate.getMonthValue());
assertThat(xmlGregorianCalendar.getDay()).isEqualTo(localDate.getDayOfMonth());
assertThat(xmlGregorianCalendar.getTimezone()).isEqualTo(DatatypeConstants.FIELD_UNDEFINED);
前述のように、_XMLGregorianCalendar_インスタンスにはタイムゾーン情報が含まれる可能性があります。 ただし、_LocalDate_には時間に関する情報がありません。
したがって、変換を実行すると、*タイムゾーン値は_FIELD_UNDEFINED_ *のままになります。

5. _XMLGregorianCalendar_から_LocalDate_へ

同様に、今度は逆に変換を実行する方法を見ていきます。 結局のところ、_XMLGregorianCalendar_から_LocalDate_への変換ははるかに簡単です。
繰り返しますが、_LocalDate_には時間に関する情報がないため、_LocalDate_インスタンスには_XMLGregorianCalendar_情報のサブセットのみを含めることができます。
_XMLGregorianCalendar_のインスタンスを作成して、変換を実行しましょう。
XMLGregorianCalendar xmlGregorianCalendar =
  DatatypeFactory.newInstance().newXMLGregorianCalendar("2019-04-25");

LocalDate localDate = LocalDate.of(
  xmlGregorianCalendar.getYear(),
  xmlGregorianCalendar.getMonth(),
  xmlGregorianCalendar.getDay());

assertThat(localDate.getYear()).isEqualTo(xmlGregorianCalendar.getYear());
assertThat(localDate.getMonthValue()).isEqualTo(xmlGregorianCalendar.getMonth());
assertThat(localDate.getDayOfMonth()).isEqualTo(xmlGregorianCalendar.getDay());

6. 結論

このクイックチュートリアルでは、_LocalDate_インスタンスと_XMLGregorianCalendar_の間の変換、およびその逆について説明しました。
そして、いつものように、サンプルコードはhttps://github.com/eugenp/tutorials/tree/master/java-dates-2[GitHub上]で入手できます。