2015-04-21 16 views
21

Cách tốt nhất để chuyển đổi giữa LocalDate từ Java 8 và XMLGregorianCalendar là gì?Chuyển đổi giữa LocalDate và XMLGregorianCalendar

+0

Nó tương tự như những gì đã được trả lời ở đây http://stackoverflow.com/questions/835889/java-util -date-to-xmlgregoriancalendar? answerertab = votes # tab-top –

+1

@AnkurAnand Tôi không nghĩ rằng câu hỏi này rất giống nhau - tôi cần chuyển đổi từ 'LocalDate', chứ không phải' Date', và tôi đã tìm kiếm một sự hội tụ trong cả hai hướng. Các câu trả lời có thể là tương tự vì chuyển đổi yêu cầu 'Ngày' như là một bước giữa, nhưng câu hỏi là không. – maja

Trả lời

48

Chuyển đổi từ LocalDate để XMLGregorianCalendar:

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

Chuyển đổi trở lại đơn giản hơn:

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

Khi chuyển đổi từ LocalDate sang XMLGregorianCalendar, tránh GregorianCalendar! Vấn đề là múi giờ của GregorianCalendar là một trường bắt buộc, nhưng LocalDate không có thông tin múi giờ trong đó! – riskop

3

Để chuyển đổi từ LocalDate để XMLGregorianCalendar bạn có thể sử dụng

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

Và để chuyển đổi XMLGregorianCalendar trở lại LocalDate:

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

LocalDate chỉ lưu trữ thông tin năm/tháng/ngày. Không có thời gian hay thông tin múi giờ trong đó. Ngày lưu trữ XMLGregorianCalendar (năm/tháng/ngày) + tùy chọntùy chọn thông tin múi giờ.

Vì vậy, việc chuyển đổi từ LOCALDATE để XMLGregorianCalendar rất đơn giản:

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

Chuyển đổi từ XMLGregorianCalendar để LOCALDATE có thể không đơn giản như vậy, bởi vì XMLGregorianCalendar thể có thời gian và múi giờ thông tin mà bạn chỉ đơn giản là không thể lưu trữ trong LocalDate. Tuy nhiên, tôi đoán rằng nếu bạn đang chuyển đổi từ XMLGregorianCalendar sang LocalDate thì XMLGregorianCalendar là kết quả của một phần tử xsd: date nontimezoned (được biểu diễn là YYYY-MM-DD trong xml). Trong trường hợp đó bạn nên chuyển đổi nó như thế này:

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

Tổng số ví dụ:

{ 
     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()); 
    } 
Các vấn đề liên quan