Joda DateTime Format for XMLGregorianCalendar Type

2022-09-04 08:00:16

我使用的是 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);
    }
}

答案 1

这是一个简短的方法:

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

答案 2

下面介绍如何将 Joda-Time 对应到类模型中。xs:dateDateTime

XML 架构

下面是一个 XML 架构,其中包含两个类型元素: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>

绑定到Joda-Timexs:dateDateTime

外部绑定文档可用于自定义类生成,下面是生成 Joda-Time 所需的操作。使用标志将绑定文档引用到 XJC。DateTimexs:date-b

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>

绑定一个实例

下面的绑定文件将导致元素使用,但不会导致元素使用。fooDateTimebar

<?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

这是您放置逻辑以将 a 转换为 from 的位置:StringDateTime

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
    }

}

详细信息


推荐