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 .