Convertendo entre LocalDate e XMLGregorianCalendar
1. Visão geral
Neste tutorial rápido, discutiremosLocalDate eXMLGregorianCalendar e forneceremos exemplos de conversão entre os dois tipos.
2. XMLGregorianCalendar
O padrão do esquema XML define regras claras para especificar datas no formato XML. Para usar esse formato, a classe JavaXMLGregorianCalendar, introduzida no Java 1.5 é uma representação deW3C XML Schema 1.0 date/time datatypes.
3. LocalDate
Uma instânciaLocalDate representa uma data sem fuso horário no sistema de calendário ISO-8601. Como resultado,LocalDate é, por exemplo, adequado para armazenar aniversários, mas não qualquer coisa relacionada ao tempo. Java introduziuLocalDate na versão 1.8.
4. DeLocalDate aXMLGregorianCalendar
Primeiro, veremos como converter deLocalDate paraXMLGregorianCalendar. Para gerar uma nova instância deXMLGregorianCalendar, usamos umDataTypeFactory do pacotejavax.xml.datatype.
Então, vamos criar uma instância deLocalDatee convertê-la emXMLGregorianCalendar:
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);
Conforme observado anteriormente, uma instânciaXMLGregorianCalendar tem a possibilidade de ter informações de fuso horário. No entanto,LocalDate não tem nenhuma informação sobre o tempo.
Portanto, quando realizamos a conversão,the timezone value will remain as FIELD_UNDEFINED.
5. DeXMLGregorianCalendar aLocalDate
Da mesma forma, agora veremos como realizar a conversão ao contrário. Acontece que a conversão de aXMLGregorianCalendar emLocalDate é muito mais fácil.
Novamente, comoLocalDate não tem informações sobre o tempo, uma instânciaLocalDate pode conter apenas um subconjunto das informaçõesXMLGregorianCalendar.
Vamos criar uma instância deXMLGregorianCalendare realizar a conversão:
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. Conclusão
Neste tutorial rápido, cobrimos as transformações entre as instâncias deLocalDate eXMLGregorianCalendar, e vice-versa.
E, como sempre, o código de amostra está disponívelover on GitHub.