Conversión entre LocalDate y XMLGregorianCalendar

1. Información general

En este tutorial rápido, discutiremos LocalDate y XMLGregorianCalendar y proporcionaremos ejemplos de conversión entre los dos tipos.

2. XMLGregorianCalendar

El estándar XML Schema define reglas claras para especificar fechas en formato XML. Para utilizar este formato, la clase Java XMLGregorianCalendar, introducida en Java 1.5, es una representación de los tipos de datos de fecha / hora W3C XML Schema 1.0.

3. LocalDate

Una instancia de LocalDate representa una fecha sin zona horaria en el sistema de calendario ISO-8601. Como resultado, LocalDate es, por ejemplo, adecuado para almacenar cumpleaños pero no nada relacionado con la hora. Java introdujo LocalDate en la versión 1.8.

4. De LocalDate a XMLGregorianCalendar

Primero, veremos cómo convertir de LocalDate a XMLGregorianCalendar . Para generar una nueva instancia de XMLGregorianCalendar , usamos un DataTypeFactory del paquete javax.xml.datatype .

Entonces, creemos una instancia de LocalDate y conviértala a 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); 

Como se señaló anteriormente, una instancia XMLGregorianCalendar tiene la posibilidad de tener información de zona horaria. Sin embargo, LocalDate no tiene información sobre la hora.

Por lo tanto, cuando realicemos la conversión, el valor de la zona horaria permanecerá como FIELD_UNDEFINED .

5. De XMLGregorianCalendar a LocalDate

Del mismo modo, ahora veremos cómo realizar la conversión al revés. Resulta que la conversión de XMLGregorianCalendar a LocalDate es mucho más fácil.

Nuevamente, dado que LocalDate no tiene información sobre la hora, una instancia de LocalDate puede contener solo un subconjunto de la información XMLGregorianCalendar .

Creemos una instancia de XMLGregorianCalendar y realicemos la conversión:

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. Conclusión

En este tutorial rápido, hemos cubierto las transformaciones entre las instancias de LocalDate y XMLGregorianCalendar , y viceversa.

Y, como siempre, el código de muestra está disponible en GitHub.