我正在使用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);
}
}
答案 0 :(得分:12)
这是一个简短的方法:
public DateTime convert(final XMLGregorianCalendar xmlgc) {
return new DateTime(xmlgc.toGregorianCalendar().getTime());
}
答案 1 :(得分:9)
以下是如何让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>
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>
这是您将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)
你的问题不明确。
如果您有java.util.Date,则可以轻松将其转换为Joda-Time DateTime:
虽然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);
}
}