Java XMLGregorianCalendar类型的Joda日期时间格式
我使用的是JAXB 2.2.8-b01 impl,我有一个模式,其中有一个xs:date元素,它创建了一个XMLGregoriacalendar实例。我正在尝试获取时间戳格式,但由于我必须有一个XMLGregorianCalendar实例,我不确定这是否可能。有什么想法吗 模式XSD:Java XMLGregorianCalendar类型的Joda日期时间格式,java,xml,jaxb,Java,Xml,Jaxb,我使用的是JAXB 2.2.8-b01 impl,我有一个模式,其中有一个xs:date元素,它创建了一个XMLGregoriacalendar实例。我正在尝试获取时间戳格式,但由于我必须有一个XMLGregorianCalendar实例,我不确定这是否可能。有什么想法吗 模式XSD: <xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/> @Xml
<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
//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);
}
}
XML转换类:
<xs:element type="xs:date" name="date-archived" minOccurs="0" maxOccurs="1" nillable="false"/>
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar date;
//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);
}
}
你的问题不清楚 约会时间? 如果您有一个java.util.Date,您可以轻松地将其转换为Joda Time DateTime:
java.util.Date
没有指定时区(它表示UTC/GMT,没有任何时区偏移),但an确实知道自己的时区。如果希望DateTime使用UTC/GMT而不是特定时区,请使用内置常量
java.util.Date someDate=new java.util.Date();
DateTime DateTime=新的日期时间(someDate,DateTimeZone.UTC);
//或者,特定的时区。
DateTimeZone timeZone=DateTimeZone.forID(“欧洲/巴黎”);
DateTime dateTimeParis=新的日期时间(someDate,时区);
转储到控制台
System.out.println(“dateTime:+dateTime”);
System.out.println(“dateTimeParis:+dateTimeParis”);
当运行时
dateTime:2014-01-22T22:39:03.996Z
巴黎时间:2014-01-22T23:39:03.996+01:00
传递日期实例,就这么简单。您可以从Date实例中提取它自启动以来的毫秒数,并将该long
number传递给DateTime。但是没有必要,因为DateTime类愿意这样做
一串
或者“时间戳格式”是指您想要这样的格式化字符串:2014-01-19T12:38.301Z
?该字符串格式是DateTime的toString
方法的默认格式
String isoString=new DateTime(someDate,DateTimeZone.UTC).toString();
使用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);
}
}
下面是如何将
xs:date
对应于Joda-TimeDateTime
生成到类模型中
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>
绑定所有实例
<?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>
com.example.MyConverter
这是将字符串
转换为fromDateTime
的逻辑:
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
}
}
更多信息
- 这是一条捷径:
public DateTime convert(final XMLGregorianCalendar xmlgc) {
return new DateTime(xmlgc.toGregorianCalendar().getTime());
}
问题不清楚,但如果您想从JodaTime
DateTime
获取XMLGregorianCalendar
,则可以:
final GregorianCalendar calendar = new GregorianCalendar(dateTime.getZone().toTimeZone());
calendar.setTimeInMillis(dateTime.getMillis());
return DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);
我们已经面对了这一问题,在花时间与格式化程序打交道之后,我们找到了一个最简单的解决方案
String sf = xmlGregDate.toString()
DateTime dateTime = DateTime.parse(sf)
这是一种生活情趣。我想真正的要求是在从我的模式生成的xml文件中使用iso支持的日期格式。没错,不使用与Java捆绑的时区数据文件。相反,它使用自己的副本。Java不经常更新它的表,而Joda Time则经常更新。此外,您可以根据需要在Joda时间内轻松完成政府机构在最后一刻偶尔做出的更改。时区数据是使用Joda time而不是捆绑的java.util.Date/Calendar类的另一个很好的理由。这些转换器方法丢弃时区信息。考虑创建带有时区的日历对象:<代码>新GRGGORICONALDEAR(DATEIMET.GETZONE)(toTimeZONE())< /代码>:这有助于链接:和<代码> XMLGRGRIGORICANLAREARIMPL/<代码>来自何处?XMLGRGGORIGANCORANDARAR XMLGRGORICORANCANDARAR = DATATYPPESTORK.NEWSTSTANCE().NEXXMLGRGGORICONALDENAR(日历);仅供参考,该项目目前正在进行中,团队建议迁移到类。看
myXMLGregorianCalendar.toGregorianCalendar().ToZoneDateTime().toString()
@BasilBourque True,只要您使用的是Java 8。对于旧版Java 7(或6或5),Joda Time是最好的方式。@crmk_üффП在Three Ten Backport项目中,Java.Time的大部分功能已被后移植到Java 6和7。当您最终转向Java 8或更高版本时,您只需切换import
语句即可。我没有意识到这一点。这将使到Java8的转换更加顺利。