Простое преобразование между java.util.Date и XMLGregorianCalendar

Я ищу простой метод преобразования между java.util.Date и javax.xml.datatype.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();
        }
    }
}

Is там что-нибудь попроще,как какой-то вызов API, который я пропустил?

Преобразование между стандартной датой / временем XML и объектом даты Java кажется довольно рутинной задачей, и я удивлен, что мне вообще приходится писать этот код.

Любой предложения?

ПРИМЕЧАНИЯ: Мои классы JAXB автоматически генерируются из схемы. Процесс сборки в моем проекте не позволяет мне вручную вносить изменения в сгенерированные классы. Элементы xs: dateTime генерируются XJC как XMLGregorianCalendar в классах JAXB. Схема периодически расширяется и настраивается, поэтому мне разрешено вносить ограниченные изменения в файл XSD схемы.

ОБНОВЛЕНИЕ РЕШЕНИЯ: Решение, предложенное Блейзом, позволило мне исключить XMLGregorianCalendar и вместо этого работать с объектами java.util.Calendar. Добавляя предложение привязки JAXB вверху моего файла схемы, XJC может генерировать более подходящие сопоставления для xs: dateTime в моих классах JAXB. Вот несколько фрагментов, которые показывают изменения в моем файле 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: dateTime также хранит часовой пояс, мне может быть лучше работать с Calendar вместо Date, поскольку объекты Calendar имеют довольно хороший API для работы с языковыми стандартами и часовыми поясами. В любом случае, мне гораздо приятнее иметь дело с объектами Calendar вместо XMLGregorianCalendar. Нет необходимости в методах преобразования, которые я перечислил выше. Я не дошел до java.util.Date, но достаточно близко!

110
задан Jim Tough 10 September 2010 в 13:02
поделиться