Ich suche nach einer einfachen Methode zum Konvertieren zwischen java.util.Date und javax.xml.datatype.XMLGregorianCalendar in beide Richtungen.
Hier ist der Code, den ich jetzt verwende :
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();
}
}
}
Gibt es etwas Einfacheres, wie einen API-Aufruf, den ich übersehen habe?
Das Konvertieren zwischen einem Standard-XML-Datums- / Uhrzeit- und einem Java-Datumsobjekt scheint eine ziemlich routinemäßige Aufgabe zu sein, und ich bin überrascht, dass ich diesen Code überhaupt schreiben muss.
Irgendwelche Vorschläge?
HINWEISE: Meine JAXB-Klassen werden automatisch aus einem Schema generiert. Der Erstellungsprozess in meinem Projekt ermöglicht es mir nicht, manuelle Änderungen an den generierten Klassen vorzunehmen. Die xs: dateTime-Elemente werden von XJC als XMLGregorianCalendar in den JAXB-Klassen generiert. Das Schema wird regelmäßig erweitert und optimiert, sodass ich nur begrenzte Änderungen an der XSD-Schemadatei vornehmen darf.
UPDATE ON SOLUTION: Die von Blaise vorgeschlagene Lösung hat es mir ermöglicht, XMLGregorianCalendar aus dem Mix zu nehmen und stattdessen mit java.util.Calendar-Objekten umzugehen. Durch Hinzufügen einer JAXB-Bindungsklausel oben in meiner Schemadatei kann XJC in meinen JAXB-Klassen geeignetere Zuordnungen für xs: dateTime generieren. Hier sind einige Ausschnitte, die die Änderungen in meiner XSD-Datei zeigen.
Das Stammelement in der XSD-Datei:
<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-Bindungsanmerkungsblock, der unmittelbar nach dem Stammelement in XSD eingefügt wird:
<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>
Da im XML xs: dateTime-Feld auch die Zeitzone gespeichert ist, ist es für mich möglicherweise besser, mit Kalender anstelle von Datum zu arbeiten, da Kalenderobjekte eine ziemlich gute API für die Arbeit mit Gebietsschemas und Zeitzonen haben. Auf jeden Fall bin ich viel glücklicher mit Kalenderobjekten als mit XMLGregorianCalendar umzugehen. Die oben aufgeführten Konvertierungsmethoden sind nicht mehr erforderlich. Ich bin nicht bis zu java.util.Date gekommen, aber nah genug!
util
Packung und benutze es.