2015-04-21 42 views
21

Jaki jest najlepszy sposób na konwersję między LocalDate z Java 8 i XMLGregorianCalendar?Konwersja między LocalDate a XMLGregorianCalendar

+0

Jest podobny do tego, co zostało tu odpowiedzi http://stackoverflow.com/questions/835889/java-util -date-to-xmlgregoriancalendar? answerertab = głosów # tab-top –

+1

@AnkurAnand Nie sądzę, że pytanie jest bardzo podobne - musiałem przekonwertować z 'LocalDate', a nie' Date', i zażądałem konwersji w oba kierunki. Odpowiedzi mogą być podobne, ponieważ konwersja wymaga "Data" jako pośredniego kroku, ale pytanie nie jest. – maja

Odpowiedz

48

konwersji z LocalDate do XMLGregorianCalendar:

LocalDate date = LocalDate.now(); 
GregorianCalendar gcal = GregorianCalendar.from(date.atStartOfDay(ZoneId.systemDefault())); 
XMLGregorianCalendar xcal = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal); 

Konwersja z powrotem jest prostsza:

xcal.toGregorianCalendar().toZonedDateTime().toLocalDate(); 
+2

Podczas konwersji z LocalDate na XMLGregorianCalendar, unikaj GregorianCalendar! Problem polega na tym, że strefa czasowa GregorianCalendar jest polem wymaganym, ale LocalDate nie zawiera informacji o strefie czasowej! – riskop

3

Aby przekonwertować z LocalDate do XMLGregorianCalendar można użyć

LocalDate localDate = ...; 
GregorianCalendar calender = new GregorianCalendar(); 
Date utilDate = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()); 
calender.setTime(utilDate);  
XMLGregorianCalendar xmlCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender); 

I przekonwertować XMLGregorianCalendar powrotem do LocalDate:

XMLGregorianCalendar xmlCal = ...; 
Date utilDate = xmlCal.toGregorianCalendar().getTime(); 
LocalDate localDate = LocalDateTime.ofInstant(utilDate.toInstant(), ZoneId.systemDefault()).toLocalDate(); 
7

Lokalna dziennik przechowuje informacje tylko rok/miesiąc/dzień. Nie ma w nim informacji o czasie ani strefie czasowej. XMLGregorianCalendar przechowuje datę (rok/miesiąc/dzień) + opcjonalnie czas i opcjonalnie informacje o strefie czasowej.

Więc konwersji z LOCALDATE do XMLGregorianCalendar jest prosta:

LocalDate in; 
XMLGregorianCalendar out; 
in = LocalDate.parse("1999-11-11"); 
out = DatatypeFactory.newInstance().newXMLGregorianCalendar(in.toString()); 

Konwersja z XMLGregorianCalendar do LOCALDATE może nie być tak proste, ponieważ XMLGregorianCalendar może mają czasu i strefy czasowej informacje, które po prostu nie można zapisać w LocalDate.

Jednak, jeśli konwertujesz z XMLGregorianCalendar na LocalDate, to XMLGregorianCalendar powstaje z elementu "xsd: date" (oznaczonego jako YYYY-MM-DD w xml). W takim przypadku należy przekształcić go tak:

XMLGregorianCalendar in; 
LocalDate out; 
in = DatatypeFactory.newInstance().newXMLGregorianCalendar("2011-11-11"); 
out = LocalDate.parse(in.toXMLFormat()); 

Cały przykład:

{ 
     LocalDate in; 
     XMLGregorianCalendar out; 
     in = LocalDate.parse("1999-11-11"); 
     out = DatatypeFactory.newInstance().newXMLGregorianCalendar(in.toString()); 
     System.out.println("in: " + in.toString()); 
     System.out.println("out: " + out.toXMLFormat()); 
    } 
    { 
     XMLGregorianCalendar in; 
     LocalDate out; 
     in = DatatypeFactory.newInstance().newXMLGregorianCalendar("2011-11-11"); 
     out = LocalDate.parse(in.toXMLFormat()); 
     System.out.println("in: " + in.toXMLFormat()); 
     System.out.println("out: " + out.toString()); 
    }