XMLGregorianCalendar类型的Joda DateTime格式

c12*_*c12 12 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"/>
Run Code Online (Sandbox Code Playgroud)

JAXB生成的属性:

@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

tho*_*ork 12

这是一个简短的方法:

public DateTime convert(final XMLGregorianCalendar xmlgc) {
    return new DateTime(xmlgc.toGregorianCalendar().getTime());
}
Run Code Online (Sandbox Code Playgroud)


bdo*_*han 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>
Run Code Online (Sandbox Code Playgroud)

绑定xs:date到Joda-TimeDateTime

外部绑定文档可用于自定义类生成,下面是生成Joda-Time DateTime所需的操作xs:date.使用-bXJC 的标志引用绑定文档.

xjc -b binding.xml schema.xsd
Run Code Online (Sandbox Code Playgroud)

绑定所有实例

<?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>
Run Code Online (Sandbox Code Playgroud)

绑定一个实例

下面的绑定文件将导致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>
Run Code Online (Sandbox Code Playgroud)

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
    }

}
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息


Bas*_*que 1

你的问题不清楚。

\n\n

约会时间?

\n\n

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

\n\n
    \n
  1. 将 Date 实例传递给 DateTime 的构造函数。
  2. \n
  3. 将 DateTimeZone 实例传递给同一构造函数。
  4. \n
\n\n

虽然 ajava.util.Date没有指定时区(它代表 UTC/GMT,没有任何时区偏移),但 anorg.joda.time.DateTime确实知道自己的时区。如果您希望 DateTime 使用 UTC/GMT 而不是特定时区,请使用内置常量DateTimeZone.UTC

\n\n
java.util.Date someDate = new java.util.Date();\nDateTime dateTime = new DateTime( someDate, DateTimeZone.UTC );\n\n// Or, a specific time zone.\nDateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );\nDateTime dateTimeParis = new DateTime( someDate, timeZone );\n
Run Code Online (Sandbox Code Playgroud)\n\n

转储到控制台\xe2\x80\xa6

\n\n
System.out.println( "dateTime: " + dateTime );\nSystem.out.println( "dateTimeParis: " + dateTimeParis );\n
Run Code Online (Sandbox Code Playgroud)\n\n

当运行\xe2\x80\xa6时

\n\n
dateTime: 2014-01-22T22:39:03.996Z\ndateTimeParis: 2014-01-22T23:39:03.996+01:00\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

细绳?

\n\n

或者通过 \xe2\x80\x9ctimestamp format\xe2\x80\x9d 你的意思是你想要一个像这样的ISO 8601格式的字符串:2014-01-19T12:38.301Z?该字符串格式是 DateTime 方法的默认格式toString

\n\n
String isoString = new DateTime( someDate, DateTimeZone.UTC ).toString();\n
Run Code Online (Sandbox Code Playgroud)\n