2015-04-21 16 views
21

Qual è il modo migliore per convertire tra LocalDate da Java 8 e XMLGregorianCalendar?Conversione tra LocalDate e XMLGregorianCalendar

+0

E 'simile a quello che è stato risposto qui http://stackoverflow.com/questions/835889/java-util -date-to-xmlgregoriancalendar? answertab = voti # tab-top –

+1

@AnkurAnand Non penso che la domanda sia molto simile - avevo bisogno di convertire da 'LocalDate', non' Date', e ho richiesto una conversione in entrambe le direzioni. Le risposte potrebbero essere simili perché la conversione richiede "Data" come passaggio intermedio, ma la domanda non lo è. – maja

risposta

48

Conversione da LocalDate a XMLGregorianCalendar:

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

La riconversione è più semplice:

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

Durante la conversione da LocalDate a XMLGregorianCalendar, evitare GregorianCalendar! Il problema è che il fuso orario di GregorianCalendar è obbligatorio, ma LocalDate non contiene informazioni sul fuso orario! – riskop

3

convertire da LocalDate a XMLGregorianCalendar è possibile utilizzare

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

E per convertire XMLGregorianCalendar tornare a LocalDate:

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

I negozi LocalDate solo informazioni di anno/mese/giorno. Non ci sono tempo né informazioni sul fuso orario. La data di archiviazione XMLGregorianCalendar (anno/mese/giorno) + facoltativamente ora e facoltativamente informazioni sul fuso orario.

Quindi la conversione da LocalDate a XMLGregorianCalendar è semplice:

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

Conversione da XMLGregorianCalendar a LocalDate potrebbe non essere così semplice, perché XMLGregorianCalendar possono avere il tempo e fuso orario informazioni che semplicemente non si può memorizzare in LocalDate.

Tuttavia, suppongo che se si esegue la conversione da XMLGregorianCalendar a LocalDate, XMLGregorianCalendar deriva da un elemento xsd: date non timezonato (rappresentato come YYYY-MM-DD in xml). In questo caso si dovrebbe convertirlo in questo modo:

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

intero esempio:

{ 
     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()); 
    } 
Problemi correlati