Conversione tra LocalDate e XMLGregorianCalendar

1. Panoramica

In questo breve tutorial, discuteremo LocalDate e XMLGregorianCalendar e forniremo esempi di conversione tra i due tipi.

2. XMLGregorianCalendar

Lo standard XML Schema definisce regole chiare per specificare le date in formato XML. Per poter utilizzare questo formato, la classe Java XMLGregorianCalendar, introdotta in Java 1.5, è una rappresentazione dei tipi di dati data / ora W3C XML Schema 1.0.

3. LocalDate

Un LocalDate esempio rappresenta una data senza fuso orario nel sistema di calendario ISO-8601. Di conseguenza, LocalDate è, ad esempio, adatto per memorizzare i compleanni ma non tutto ciò che riguarda l'ora. Java ha introdotto LocalDate nella versione 1.8.

4. Da LocalDate a XMLGregorianCalendar

Per prima cosa, vedremo come convertire da LocalDate a XMLGregorianCalendar . Per generare una nuova istanza di XMLGregorianCalendar , utilizziamo DataTypeFactory dal pacchetto javax.xml.datatype .

Quindi, creiamo un'istanza di LocalDate e convertiamola in 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); 

Come notato in precedenza, un'istanza XMLGregorianCalendar ha la possibilità di avere informazioni sul fuso orario. Tuttavia, LocalDate non dispone di informazioni sull'ora.

Pertanto, quando eseguiamo la conversione, il valore del fuso orario rimarrà FIELD_UNDEFINED .

5. Da XMLGregorianCalendar a LocalDate

Allo stesso modo, ora vedremo come eseguire la conversione al contrario. A quanto pare, la conversione da XMLGregorianCalendar a LocalDate è molto più semplice.

Ancora una volta, poiché LocalDate non dispone di informazioni sull'ora, un'istanza di LocalDate può contenere solo un sottoinsieme delle informazioni XMLGregorianCalendar .

Creiamo un'istanza di XMLGregorianCalendar ed eseguiamo la conversione:

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. Conclusione

In questo breve tutorial, abbiamo coperto le trasformazioni tra le istanze di LocalDate e XMLGregorianCalendar e viceversa.

E, come sempre, il codice di esempio è disponibile su GitHub.