XMLGregorianCalendar类型的Joda DateTime格式

时间:2014-01-22 22:03:33

标签: java xml jaxb

我正在使用JAXB 2.2.8-b01 impl,我有一个架构,它有一个xs:date元素,用于创建XMLGregorianCalendar实例。我正在尝试获取Joda-Time DateTime时间戳格式,但由于我必须有一个XMLGregorianCalendar实例,所以我不确定它是否可行。有什么想法吗?

架构XSD:

<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>

JAXB生成的属性:

@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;

XML转换类:

//java.util.Date being passed


private XMLGregorianCalendar converToGregorianCal(Date date) {
    DatatypeFactory df = null;
    try {
        df = DatatypeFactory.newInstance();
    } catch (DatatypeConfigurationException e) {
        LOG.error("error getting DatatypeFactory instance " + e.getMessage()); 
    }
    if (date == null) {
        return null;
    } else {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeInMillis(date.getTime());
        return df.newXMLGregorianCalendar(gc);
    }
}

6 个答案:

答案 0 :(得分:12)

这是一个简短的方法:

public DateTime convert(final XMLGregorianCalendar xmlgc) {
    return new DateTime(xmlgc.toGregorianCalendar().getTime());
}

答案 1 :(得分:9)

以下是如何让xs:date对应于在类模型中生成的Joda-Time DateTime

XML Schema

下面是一个XML Schema,其中包含两个xs:date类型的元素:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <element name="root">
        <complexType>
            <sequence>
                <element name="foo" type="date"/>
                <element name="bar" type="date"/>
            </sequence>
        </complexType>
    </element>

</schema>

xs:date绑定到Joda-Time DateTime

外部绑定文档可用于自定义类生成,下面是为DateTime生成Joda-Time xs:date所需执行的操作。使用-b标志向XJC引用绑定文档。

xjc -b binding.xml schema.xsd

绑定所有实例

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.1"
              xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
              xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:globalBindings>
        <!-- use JODA-Time DateTime for xs:date -->
        <jxb:javaType name="org.joda.time.DateTime" xmlType="xs:date"
            parseMethod="com.example.MyConverter.parseDate"
            printMethod="com.example.MyConverter.printDate"/>
    </jxb:globalBindings>        
</jxb:bindings>

绑定一个实例

下面的绑定文件会导致foo元素使用DateTime但不会使用bar元素。

<?xml version="1.0" encoding="UTF-8"?>
<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="schema.xsd">
        <jxb:bindings node="//xs:element[@name='foo']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType 
                       name="org.joda.time.DateTime" 
                       parseMethod="com.example.MyConverter.parseDate" 
                       printMethod="com.example.MyConverter.printDate" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

com.example.MyConverter

这是您将String转换为DateTime的逻辑:

import org.joda.time.DateTime;

public class MyConverter {

    public static String printDate(DateTime value) {
        // TODO - Conversion Logic
    }

    public static DateTime parseDate(String value) {
       // TODO - Conversion Logic
    }

}

更多信息

答案 2 :(得分:4)

问题不清楚,但如果你想要JodaTime XMLGregorianCalendar的{​​{1}},那么这是可能的:

DateTime

答案 3 :(得分:2)

你的问题不明确。

的DateTime?

如果您有java.util.Date,则可以轻松将其转换为Joda-Time DateTime:

  1. 将Date实例传递给DateTime的构造函数。
  2. 将DateTimeZone实例传递给相同的构造函数。
  3. 虽然java.util.Date没有分配时区(它代表UTC / GMT,没有任何时区偏移),但org.joda.time.DateTime确实知道自己的时区。如果您希望DateTime具有UTC / GMT而不是特定时区,请使用内置常量DateTimeZone.UTC

    java.util.Date someDate = new java.util.Date();
    DateTime dateTime = new DateTime( someDate, DateTimeZone.UTC );
    
    // Or, a specific time zone.
    DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
    DateTime dateTimeParis = new DateTime( someDate, timeZone );
    

    转储到控制台...

    System.out.println( "dateTime: " + dateTime );
    System.out.println( "dateTimeParis: " + dateTimeParis );
    

    跑步时......

    dateTime: 2014-01-22T22:39:03.996Z
    dateTimeParis: 2014-01-22T23:39:03.996+01:00
    

    传递Date实例,就这么简单。您可以从Date实例中提取自Unix Epoch以来的毫秒数,并将该long个数字传递给DateTime。但是没有必要,因为DateTime类愿意这样做。

    字符串?

    或者通过“时间戳格式”,您是否想要一个ISO 8601格式化的字符串,如下所示:2014-01-19T12:38.301Z?该字符串格式是DateTime的toString方法的默认值。

    String isoString = new DateTime( someDate, DateTimeZone.UTC ).toString();
    

答案 4 :(得分:1)

我们已经面对这个问题,并且花了很多时间与格式化程序找到了最简单的解决方案

String sf = xmlGregDate.toString()
DateTime dateTime = DateTime.parse(sf)

这是一种生活品味。

答案 5 :(得分:-3)

对JodaTime非常小心,lib不使用java的时区表。

public class XMLCalendarToDateTime {

    private static DatatypeFactory df = null;
    static {
        try {
            df = DatatypeFactory.newInstance();
        } catch (DatatypeConfigurationException dce) {
            throw new IllegalStateException(
                "Exception while obtaining DatatypeFactory instance", dce);
        }
    }  

    private static XMLGregorianCalendar converToGregorianCal(DateTime dateTime) {
        if (dateTime == null) {
            return null;
        } else {
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTimeInMillis(dateTime.getMillis());
            return df.newXMLGregorianCalendar(gc);
        }
    }

    private static DateTime convertToDateTime(XMLGregorianCalendar xmlGregorianCalendar){
         if (xmlGregorianCalendar == null) {
                return null;
            } else {
                return new DateTime(xmlGregorianCalendar.toGregorianCalendar().getTime());
            }
    }

    public static void main(String[] args) {

        final DateTime dateTime = new DateTime(2014,1,1,1,1);

        System.out.println("date = " + dateTime.toString());

        final XMLGregorianCalendar xmlGregorianCalendar = converToGregorianCal(dateTime);

        System.out.println("xmlGregorianCalendar = " + xmlGregorianCalendar);

        final DateTime dateTimeConverted = convertToDateTime(xmlGregorianCalendar);

        System.out.println("dateTimeConverted = "  + dateTimeConverted);

    }
}