Tôi đang tìm một phương pháp đơn giản để chuyển đổi giữa java.util.Date và javax.xml.datatype.XMLGregorianCalendar theo cả hai hướng.
Đây là mã mà tôi đang sử dụng bây giờ :
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, như một số lệnh gọi API mà tôi đã bỏ qua không?
Chuyển đổi giữa một ngày / giờ XML chuẩn và một đối tượng ngày trong Java có vẻ như là một nhiệm vụ khá thường xuyên và tôi ngạc nhiên rằng tôi phải viết mã này.
Bất kỳ đề xuất?
LƯU Ý: Các lớp JAXB của tôi được tạo tự động từ một lược đồ. 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 đã tạo. 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. Lược đồ được mở rộng và chỉnh sửa đị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 của lược đồ.
CẬP NHẬT GIẢI PHÁP: Giải pháp do Blaise đề xuất đã cho phép tôi đưa XMLGregorianCalendar ra khỏi hỗn hợp và xử lý các đối tượng java.util.Calendar để thay thế. Bằng cách thêm mệnh đề ràng buộc JAXB ở đầu tệp lược đồ của tôi, XJC có thể tạo 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 mã hiển thị các sửa đổi trong tệp XSD của tôi.
Phần tử gốc trong tệp 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">
Khối chú thích liên kết JAXB, được 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>
Vì trường XML xs: dateTime cũng lưu trữ múi giờ, tốt hơn là tôi nên làm việc với Lịch thay vì Ngày vì các đối tượng Lịch có một 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 xử lý các đối tượng Lịch thay vì XMLGregorianCalendar. Không cần các phương pháp chuyển đổi mà tôi đã liệt kê ở trên nữa. Tôi không hiểu được tất cả các cách để java.util.Date, nhưng đủ gần!
util
gói và sử dụng nó.