Conversion entre LocalDate et XMLGregorianCalendar

1. Vue d'ensemble

Dans ce rapide tutoriel, nous discuterons de LocalDate et XMLGregorianCalendar et fournirons des exemples de conversion entre les deux types.

2. XMLGregorianCalendar

La norme XML Schema définit des règles claires pour la spécification des dates au format XML. Pour utiliser ce format, la classe Java XMLGregorianCalendar, introduite dans Java 1.5, est une représentation des types de données date / heure W3C XML Schema 1.0.

3. LocalDate

Une instance LocalDate représente une date sans fuseau horaire dans le système de calendrier ISO-8601. En conséquence, LocalDate est, par exemple, adapté pour stocker les anniversaires mais pas tout ce qui est lié à l'heure. Java a introduit LocalDate dans la version 1.8.

4. De LocalDate à XMLGregorianCalendar

Tout d'abord, nous verrons comment convertir LocalDate en XMLGregorianCalendar . Afin de générer une nouvelle instance de XMLGregorianCalendar , nous utilisons un DataTypeFactory du package javax.xml.datatype .

Alors, créons une instance de LocalDate et convertissons-la en 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); 

Comme indiqué précédemment, une instance XMLGregorianCalendar a la possibilité d'avoir des informations de fuseau horaire. Cependant, LocalDate ne dispose d'aucune information sur l'heure.

Par conséquent, lorsque nous effectuons la conversion, la valeur du fuseau horaire restera comme FIELD_UNDEFINED .

5. De XMLGregorianCalendar à LocalDate

De même, nous allons maintenant voir comment effectuer la conversion dans l'autre sens. En fait, la conversion d'un XMLGregorianCalendar en LocalDate est beaucoup plus facile.

Là encore, étant donné que LocalDate ne dispose pas d'informations sur l'heure, une instance LocalDate ne peut contenir qu'un sous-ensemble des informations XMLGregorianCalendar .

Créons une instance de XMLGregorianCalendar et effectuons la conversion:

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

Dans ce tutoriel, nous avons couvert les transformations entre LOCALDATE instances et XMLGregorianCalendar , et vice-versa.

Et, comme toujours, l'exemple de code est disponible à l'adresse over sur GitHub.