Автор оригинала: Antonio Manuel Moreno Delgado.
1. Обзор
В этом кратком руководстве мы обсудим Local Date и XMLGregorianCalendar и приведем примеры преобразования между этими двумя типами.
2. XMLGregorianCalendar
Стандарт схемы XML определяет четкие правила для указания дат в формате XML. Для использования этого формата класс Java XMLGregorianCalendar , представленный в Java 1.5, представляет собой представление типов данных W3C XML Schema 1.0 date | time|/.
3. Местная Дата
Экземпляр Local Data представляет дату без часового пояса в календарной системе ISO-8601. В результате Локальные данные , например, подходят для хранения дней рождения, но не для хранения чего-либо, связанного со временем. Java представила Локальную дату в версии 1.8.
4. Из LocalDate в XMLGregorianCalendar
Сначала мы посмотрим, как преобразовать Local Date в 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 имеет возможность иметь информацию о часовом поясе. Однако Local Date не содержит никакой информации о времени.
Поэтому, когда мы выполняем преобразование, значение часового пояса останется как FIELD_UNDEFINED .
5. От XMLGregorianCalendar до локальной даты
Аналогично, теперь мы увидим, как выполнить преобразование наоборот. Как оказалось, преобразование из XMLGregorianCalendar в Local Date намного проще.
Опять же, поскольку LocalDate не содержит информации о времени, экземпляр Local Data может содержать только подмножество информации 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 .