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

I ' Я ищу простой метод преобразования между 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();
        }
    }
}

Есть ли что-нибудь попроще, например вызов 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. Нет необходимости в методах преобразования, которые я перечислил выше. Но мне нужно получить только хеш-значение, а не имя файла. md5 = `md5sum $ {my_iso_file}` echo $ {md5} 3abb17b66815bc7946cefe727737d295 ./iso/...

Я использую md5sum для генерации хеш-значения для файла. Но мне нужно получить только хеш-значение, а не имя файла.

md5=`md5sum ${my_iso_file}`
echo ${md5}

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Как я могу «вырезать» имя файла и оставить только значение?

158
задан Burhan Ali 9 January 2012 в 12:40
поделиться