1. 概要

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

2. XMLGregorianCalendar

XMLスキーマ標準は、XML形式で日付を指定するための明確なルールを定義しています。 この形式を使用するために、Java1.5で導入されたJavaクラスXMLGregorianCalendar は、W3CXMLスキーマ1.0日付/時刻データ型の表現です。

3. LocalDate

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の間の変換、およびその逆について説明しました。

また、いつものように、サンプルコードはGitHubから入手できます。