Java >> Java tutorial >  >> Tag >> XML

Konvertering mellem LocalDate og XMLGregorianCalendar

1. Oversigt

I denne hurtige selvstudie vil vi diskutere LocalDate og XMLGregorianCalendar og giv eksempler på konvertering mellem de to typer.

2. XMLGregorianCalendar

XML Schema-standarden definerer klare regler for angivelse af datoer i XML-format. For at bruge dette format, Java-klassen XMLGregorianCalendar, introduceret i Java 1.5, er en repræsentation af W3C XML Schema 1.0 dato/tid datatyper.

3. LocalDate

En LocalDate instans repræsenterer en dato uden en tidszone i ISO-8601-kalendersystemet. Som et resultat, LocalDate er for eksempel velegnet til opbevaring af fødselsdage men ikke noget, der har med tid at gøre. Java introducerede LocalDate i version 1.8.

4. Fra LocalDate til XMLGregorianCalendar

Først skal vi se, hvordan man konverterer fra LocalDate til XMLGregorianCalendar . For at generere en ny forekomst af XMLGregorianCalendar , bruger vi en DataTypeFactory fra javax.xml.datatype pakke.

Så lad os oprette en forekomst af LocalDate og konverter den til 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);

Som tidligere nævnt er en XMLGregorianCalendar instans har mulighed for at have tidszoneoplysninger. Dog LocalDate har ingen information om tid.

Derfor, når vi udfører konverteringen, forbliver tidszoneværdien som FIELD_UNDEFINED .

5. Fra XMLGregorianCalendar til LocalDate

Ligeledes vil vi nu se, hvordan du udfører konverteringen omvendt. Som det viser sig, at konvertere fra en XMLGregorianCalendar til LocalDate er meget nemmere.

Igen, siden LocalDate ikke har information om tid, en LocalDate instans kan kun indeholde et undersæt af XMLGregorianCalendar information.

Lad os oprette en forekomst af XMLGregorianCalendar og udfør konverteringen:

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

I denne hurtige selvstudie har vi dækket transformationerne mellem LocalDate instanser og XMLGregorianCalendar , og omvendt.

Og som altid er prøvekoden tilgængelig på GitHub.


Java tag