2015-04-21 76 views
21

什麼是在Java 8和XMLGregorianCalendar之間轉換LocalDate的最佳方式?LocalDate和XMLGregorianCalendar之間的轉換

+0

什麼已經在這裏找到答案 它類似於http://stackoverflow.com/questions/835889/java-util -date-to-xmlgregoriancalendar?answertab = votes#tab-top –

+1

@AnkurAnand我不認爲這個問題非常相似 - 我需要從'LocalDate'轉換而不是'Date',並且我需要轉換兩個方向。答案可能是相似的,因爲轉換需要「日期」作爲一步之間,但問題不是。 – maja

回答

48

LocalDate轉換爲XMLGregorianCalendar

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

轉換回來更簡單:

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

從LocalDate轉換爲XMLGregorianCalendar時,請避免使用GregorianCalendar!問題是GregorianCalendar的時區是必填字段,但LocalDate中沒有時區信息! – riskop

3

LocalDate轉換爲XMLGregorianCalendar可以使用

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

並以XMLGregorianCalendar轉換回LocalDate

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

LocalDate僅存儲年/月/日信息。它沒有時間和時區信息。 XMLGregorianCalendar存儲日期(年/月/日)+ 可選時間和可選時區信息。

所以從LOCALDATE的轉換的XMLGregorianCalendar很簡單:

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

從的XMLGregorianCalendar轉換爲LOCALDATE的可能並非如此簡單,因爲的XMLGregorianCalendar 可以有,你根本無法存儲時間和時區信息在LocalDate中。

但是,我猜如果你是從XMLGregorianCalendar轉換到LocalDate,那麼XMLGregorianCalendar是由非時區的xsd:date元素(在xml中表示爲YYYY-MM-DD)產生的。在這種情況下,你應該把它轉換是這樣的:

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

整體例如:

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