我正在使用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)
下面是如何xs:date将Joda-Time对应DateTime生成到类模型中的方法.
下面是一个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)
这是您将逻辑转换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)
你的问题不清楚。
\n\n如果您有 java.util.Date,您可以轻松地将其转换为 Joda-Time DateTime:
\n\n虽然 ajava.util.Date没有指定时区(它代表 UTC/GMT,没有任何时区偏移),但 anorg.joda.time.DateTime确实知道自己的时区。如果您希望 DateTime 使用 UTC/GMT 而不是特定时区,请使用内置常量DateTimeZone.UTC。
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 );\nRun Code Online (Sandbox Code Playgroud)\n\n转储到控制台\xe2\x80\xa6
\n\nSystem.out.println( "dateTime: " + dateTime );\nSystem.out.println( "dateTimeParis: " + dateTimeParis );\nRun Code Online (Sandbox Code Playgroud)\n\n当运行\xe2\x80\xa6时
\n\ndateTime: 2014-01-22T22:39:03.996Z\ndateTimeParis: 2014-01-22T23:39:03.996+01:00\nRun Code Online (Sandbox Code Playgroud)\n\n传递 Date 实例,就这么简单。您可以从 Date 实例中提取自Unix Epoch以来的毫秒数,并将该long数字传递给 DateTime。但没有必要,因为 DateTime 类愿意做这项工作。
或者通过 \xe2\x80\x9ctimestamp format\xe2\x80\x9d 你的意思是你想要一个像这样的ISO 8601格式的字符串:2014-01-19T12:38.301Z?该字符串格式是 DateTime 方法的默认格式toString。
String isoString = new DateTime( someDate, DateTimeZone.UTC ).toString();\nRun Code Online (Sandbox Code Playgroud)\n