Преобразуване между LocalDate и XMLGregorianCalendar

1. Общ преглед

В този бърз урок ще обсъдим LocalDate и XMLGregorianCalendar и ще предоставим примери за конвертиране между двата типа.

2. XMLGregorianCalendar

Стандартът на XML Schema определя ясни правила за посочване на дати в XML формат. За да се използва този формат, Java класът XMLGregorianCalendar, въведен в Java 1.5, е представяне на типовете данни за дата / час на W3C XML Schema 1.0.

3. LocalDate

А LOCALDATE инстанция представлява дата без часови пояс в ISO-8601 календарна система. В резултат LocalDate е например подходящ за съхраняване на рождени дни, но не и на нещо, свързано с времето. Java представи LocalDate във версия 1.8.

4. От LocalDate до XMLGregorianCalendar

Първо ще видим как да конвертираме от LocalDate в XMLGregorianCalendar . За да генерираме нов екземпляр на XMLGregorianCalendar , използваме DataTypeFactory от пакета javax.xml.datatype .

И така, нека създадем екземпляр на LocalDate и го преобразуваме в 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); 

Както бе отбелязано по- рано, екземпляр XMLGregorianCalendar има възможност да има информация за часовата зона. Въпреки това, LOCALDATE не разполага с никаква информация за времето.

Следователно, когато извършим преобразуването, стойността на часовата зона ще остане като FIELD_UNDEFINED .

5. От XMLGregorianCalendar до LocalDate

По същия начин сега ще видим как да извършим преобразуването обратно. Както се оказва, конвертирането от XMLGregorianCalendar в LocalDate е много по-лесно.

Отново, тъй като LocalDate няма информация за времето, екземпляр LocalDate може да съдържа само подмножество от информация за XMLGregorianCalendar .

Нека създадем екземпляр на XMLGregorianCalendar и извършим преобразуването:

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. Заключение

В този бърз урок разгледахме трансформациите между екземпляри LocalDate и XMLGregorianCalendar и обратно.

Както винаги, примерният код е достъпен в GitHub.