Tôi đang tìm một phương thức chuyển đổi đơn giản giữa java.util.Date và javax.xml.datatype.XMLGregorianCalendar theo cả hai hướng.Chuyển đổi đơn giản giữa java.util.Date và XMLGregorianCalendar
Đây là mã mà tôi đang sử dụng hiện nay:
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
/**
* Utility class for converting between XMLGregorianCalendar and java.util.Date
*/
public class XMLGregorianCalendarConverter {
/**
* Needed to create XMLGregorianCalendar instances
*/
private static DatatypeFactory df = null;
static {
try {
df = DatatypeFactory.newInstance();
} catch (DatatypeConfigurationException dce) {
throw new IllegalStateException(
"Exception while obtaining DatatypeFactory instance", dce);
}
}
/**
* Converts a java.util.Date into an instance of XMLGregorianCalendar
*
* @param date Instance of java.util.Date or a null reference
* @return XMLGregorianCalendar instance whose value is based upon the
* value in the date parameter. If the date parameter is null then
* this method will simply return null.
*/
public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) {
if (date == null) {
return null;
} else {
GregorianCalendar gc = new GregorianCalendar();
gc.setTimeInMillis(date.getTime());
return df.newXMLGregorianCalendar(gc);
}
}
/**
* Converts an XMLGregorianCalendar to an instance of java.util.Date
*
* @param xgc Instance of XMLGregorianCalendar or a null reference
* @return java.util.Date instance whose value is based upon the
* value in the xgc parameter. If the xgc parameter is null then
* this method will simply return null.
*/
public static java.util.Date asDate(XMLGregorianCalendar xgc) {
if (xgc == null) {
return null;
} else {
return xgc.toGregorianCalendar().getTime();
}
}
}
Có điều gì đơn giản hơn, giống như một số cuộc gọi API mà tôi đã bỏ qua?
Chuyển đổi giữa ngày/giờ XML chuẩn và đối tượng ngày Java có vẻ như một công việc khá thường xuyên và tôi ngạc nhiên là tôi phải viết mã này.
Mọi đề xuất?
GHI CHÚ: Các lớp JAXB của tôi được tự động tạo từ giản đồ. Quá trình xây dựng trên dự án của tôi không cho phép tôi thực hiện các thay đổi thủ công đối với các lớp được tạo ra. Các phần tử xs: dateTime đang được tạo bởi XJC dưới dạng XMLGregorianCalendar trong các lớp JAXB. Giản đồ này được mở rộng và điều chỉnh định kỳ, vì vậy tôi được phép thực hiện các thay đổi hạn chế đối với tệp XSD lược đồ.
CẬP NHẬT VỀ GIẢI PHÁP: Các giải pháp của Blaise đề xuất đã cho phép tôi đưa XMLGregorianCalendar ra khỏi hỗn hợp và đối phó với java.util.Calendar đối tượng để thay thế. Bằng cách thêm một mệnh đề liên kết JAXB ở đầu tệp lược đồ của tôi, XJC có thể tạo ra các ánh xạ thích hợp hơn cho xs: dateTime trong các lớp JAXB của tôi. Dưới đây là một số đoạn trích hiển thị các sửa đổi trong tệp XSD của tôi.
Phần tử gốc trong file XSD:
<xs:schema xmlns:mydata="http://my.example.com/mydata" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://my.example.com/mydata" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="0.2" xml:lang="en" jaxb:version="2.0">
JAXB ràng buộc khối chú thích, chèn ngay sau phần tử gốc trong XSD:
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings>
<jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
Kể từ khi xs XML: Trường dateTime cũng lưu trữ múi giờ, có thể tốt hơn nếu tôi làm việc với Lịch thay vì Ngày kể từ khi các đối tượng Lịch có API khá tốt để làm việc với các ngôn ngữ và múi giờ. Trong mọi trường hợp, tôi hạnh phúc hơn nhiều khi đối phó với các đối tượng Lịch thay vì XMLGregorianCalendar. Không cần cho các phương pháp chuyển đổi mà tôi liệt kê ở trên nữa. Tôi đã không nhận được tất cả các cách để java.util.Date, nhưng đủ gần!
Sắp xếp sang một bên, nhưng tại sao bạn phải đối phó với các đối tượng XMLGregorianCalendar ngay từ đầu? Họ rất khó chịu. Nếu chúng đến từ jaxb, bạn có thể sử dụng @XMLTypeAdapter để liên kết trực tiếp với java.util.Date. Tất nhiên nếu bạn đang tự động tạo ra một lược đồ, việc thay đổi các đối tượng có thể gây khó chịu khi bạn tạo lại. – Affe
@Affe Tôi tự động tạo ra một lược đồ để tôi không thể thực hiện bất kỳ thay đổi thủ công nào đối với các lớp JAXB được tạo ra –
Đây có phải là http://stackoverflow.com/questions/835889/java-util-date-to -xmlgregoriancalendar? –