Saya mencari metode sederhana untuk mengubah antara java.util.Date dan javax.xml.datatype.XMLGregorianCalendar di kedua arah.
Ini kode yang saya gunakan sekarang :
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();
}
}
}
Apakah ada yang lebih sederhana, seperti beberapa panggilan API yang telah saya abaikan?
Mengubah antara tanggal / waktu XML standar dan objek tanggal Java tampaknya seperti tugas yang cukup rutin dan saya terkejut bahwa saya harus menulis kode ini sama sekali.
Ada saran?
CATATAN: Kelas JAXB saya dibuat secara otomatis dari skema. Proses membangun proyek saya tidak memungkinkan saya untuk membuat perubahan manual pada kelas yang dibuat. Elemen xs: dateTime sedang dibuat oleh XJC sebagai XMLGregorianCalendar di kelas JAXB. Skema diperpanjang dan diubah secara berkala, jadi saya diizinkan untuk membuat perubahan terbatas pada file skema XSD.
UPDATE ON SOLUTION: Solusi yang diusulkan oleh Blaise memungkinkan saya untuk mengeluarkan XMLGregorianCalendar dari campuran dan menangani objek java.util.Calendar sebagai gantinya. Dengan menambahkan klausa pengikatan JAXB di bagian atas file skema saya, XJC dapat menghasilkan pemetaan yang lebih sesuai untuk xs: dateTime di kelas JAXB saya. Berikut beberapa cuplikan yang menunjukkan modifikasi pada file XSD saya.
Elemen root di 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">
Blok anotasi pengikatan JAXB, dimasukkan segera setelah elemen root di 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>
Karena bidang XML xs: dateTime juga menyimpan zona waktu, mungkin lebih baik bagi saya untuk bekerja dengan Kalender daripada Tanggal karena objek Kalender memiliki API yang cukup bagus untuk bekerja dengan lokal dan zona waktu. Bagaimanapun, saya jauh lebih senang menangani objek Kalender daripada XMLGregorianCalendar. Tidak perlu lagi metode konversi yang saya cantumkan di atas. Saya tidak mengerti sepenuhnya java.util.Date, tapi cukup dekat!
util
paket dan gunakan.