LocalDateとXMLGregorianCalendar間の変換
1. 概要
このクイックチュートリアルでは、LocalDateとXMLGregorianCalendarについて説明し、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でから入手できます。