我正在尋找一個簡單的方法在兩個方向之間轉換java.util.Date和javax.xml.datatype.XMLGregorianCalendar。簡單轉換java.util.Date和XMLGregorianCalendar
這裏是我現在使用代碼:
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();
}
}
}
有什麼簡單的,像我忽略了一些API調用?
標準XML日期/時間和Java日期對象之間的轉換看起來像是一個相當常規的任務,我很驚訝我必須編寫這些代碼。
有什麼建議嗎?
備註: 我的JAXB類是從模式自動生成的。我的項目上的構建過程不允許我手動更改生成的類。 xj:dateTime元素由XJC生成爲JAXB類中的XMLGregorianCalendar。該模式是定期擴展和調整的,因此我可以對模式XSD文件進行有限的更改。
UPDATE ON SOLUTION: 布萊斯提出的解決方案允許我採取的XMLGregorianCalendar出混合和處理的java.util.Calendar對象,而不是。通過在模式文件頂部添加一個JAXB綁定子句,XJC能夠爲我的JAXB類中的xs:dateTime生成更合適的映射。這裏有一些片段顯示了我的XSD文件中的修改。
在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綁定註釋塊,在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>
由於XML的xs:日期時間字段也存儲時區,因此我可以使用Calendar而不是Date來處理日曆,因爲Calendar對象具有用於處理語言環境和時區的相當不錯的API。無論如何,我很樂意處理日曆對象而不是XMLGregorianCalendar。不需要我上面列出的轉換方法了。我沒有完全掌握java.util.Date,但足夠接近!
排序的一邊,但爲什麼你必須在第一時間處理XMLGregorianCalendar對象?他們有點惱人。如果他們來自jaxb,可以使用@XMLTypeAdapter直接綁定到java.util.Date。當然,如果您是從模式自動生成的,那麼在重新生成時更改對象可能同樣令人討厭。 – Affe 2010-09-09 18:19:13
@Affe我自動生成一個模式,所以我不能對生成的JAXB類進行任何手動更改 – 2010-09-09 18:22:17
這與http://stackoverflow.com/questions/835889/java-util-date-to -xmlgregoriancalendar? – 2010-09-09 18:24:12