Her iki yönde java.util.Date ve javax.xml.datatype.XMLGregorianCalendar arasında dönüştürme yapmak için basit bir yöntem arıyorum.
İşte şimdi kullandığım kod :
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();
}
}
}
Gözden kaçırdığım bazı API çağrıları gibi daha basit bir şey var mı?
Standart bir XML tarih / saati ile bir Java tarih nesnesi arasında dönüşüm yapmak oldukça rutin bir görev gibi görünüyor ve bu kodu yazmam gerektiğine şaşırdım.
Baska öneri?
NOTLAR: JAXB sınıflarım bir şemadan otomatik olarak oluşturuldu. Projemdeki derleme süreci, oluşturulan sınıflarda manuel değişiklikler yapmama izin vermiyor. Xs: dateTime öğeleri, JAXB sınıflarında XMLGregorianCalendar olarak XJC tarafından üretiliyor. Şema periyodik olarak genişletilir ve değiştirilir, bu nedenle şema XSD dosyasında sınırlı değişiklikler yapmama izin verilir.
ÇÖZÜM ÜZERİNDE GÜNCELLEME: Blaise tarafından önerilen çözüm, XMLGregorianCalendar'ı karışımdan çıkarmama ve bunun yerine java.util.Calendar nesneleriyle ilgilenmeme izin verdi. Şema dosyamın üstüne bir JAXB bağlama cümlesi ekleyerek, XJC, JAXB sınıflarımdaki xs: dateTime için daha uygun eşlemeler oluşturabilir. XSD dosyamdaki değişiklikleri gösteren bazı parçacıklar.
XSD dosyasındaki kök öğe:
<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">
XSD'de kök öğeden hemen sonra eklenen JAXB bağlama ek açıklama bloğu:
<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>
XML xs: dateTime alanı da saat dilimini sakladığından, Takvim nesneleri yerel ayarlar ve saat dilimleriyle çalışmak için oldukça iyi bir API'ye sahip olduğundan, yine de Date yerine Calendar ile çalışmak benim için daha iyi olabilir. Her durumda, XMLGregorianCalendar yerine Takvim nesneleriyle uğraşmaktan çok daha mutluyum. Artık yukarıda listelediğim dönüştürme yöntemlerine gerek yok. Java.util.Date'e kadar gelemedim ama yeterince yaklaştım!
util
pakete koyun ve kullanın.