Je recherche une méthode simple de conversion entre java.util.Date et javax.xml.datatype.XMLGregorianCalendar dans les deux sens.
Voici le code que j'utilise maintenant :
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();
}
}
}
Y a-t-il quelque chose de plus simple, comme un appel d'API que j'ai négligé?
La conversion entre une date / heure XML standard et un objet de date Java semble être une tâche assez routinière et je suis surpris de devoir écrire ce code.
Aucune suggestion?
REMARQUES: Mes classes JAXB sont générées automatiquement à partir d'un schéma. Le processus de construction de mon projet ne me permet pas d'apporter des modifications manuelles aux classes générées. Les éléments xs: dateTime sont générés par XJC en tant que XMLGregorianCalendar dans les classes JAXB. Le schéma est étendu et modifié périodiquement, je suis donc autorisé à apporter des modifications limitées au fichier XSD de schéma.
MISE À JOUR SUR LA SOLUTION: La solution proposée par Blaise m'a permis de sortir XMLGregorianCalendar du mix et de traiter les objets java.util.Calendar à la place. En ajoutant une clause de liaison JAXB en haut de mon fichier de schéma, XJC est capable de générer des mappages plus appropriés pour xs: dateTime dans mes classes JAXB. Voici quelques extraits qui montrent les modifications dans mon fichier XSD.
L'élément racine dans le fichier 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">
Bloc d'annotation de liaison JAXB, inséré immédiatement après l'élément racine dans 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>
Étant donné que le champ XML xs: dateTime stocke également le fuseau horaire, il serait peut-être préférable pour moi de travailler avec Calendar au lieu de Date de toute façon, car les objets Calendar ont une assez bonne API pour travailler avec les paramètres régionaux et les fuseaux horaires. Dans tous les cas, je suis beaucoup plus heureux de traiter les objets Calendar au lieu de XMLGregorianCalendar. Plus besoin des méthodes de conversion que j'ai énumérées ci-dessus. Je ne suis pas arrivé à java.util.Date, mais assez près!
util
emballage et utilisez-le.