Перейти к основному содержимому

Преобразование между LocalDate и XMLGregorianCalendar

· 2 мин. чтения

1. Обзор

В этом кратком руководстве мы обсудим LocalDate и XMLGregorianCalendar и предоставим примеры преобразования между двумя типами.

2. XMLГрегорианский календарь

Стандарт XML-схемы определяет четкие правила для указания дат в формате XML. Чтобы использовать этот формат, класс Java XMLGregorianCalendar , представленный в Java 1.5, представляет собой представление типов данных даты/времени W3C XML Schema 1.0 .

3. Местная дата

Экземпляр LocalDate представляет дату без часового пояса в календарной системе ISO-8601. В результате LocalDate подходит, например, для хранения дней рождения, но не для всего, что связано со временем. Java представила LocalDate в версии 1.8.

4. От LocalDate к XMLGregorianCalendar

Во-первых, мы увидим, как преобразовать LocalDate в XMLGregorianCalendar . Для создания нового экземпляра XMLGregorianCalendar мы используем DataTypeFactory из пакета javax.xml.datatype .

Итак, давайте создадим экземпляр 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 .