如何指定JAXB编组xsd:dateTime时使用的date格式?

当JAXB将date对象( XMLGregorianCalendar )编组到xsd:dateTime元素中时,如何指定生成的XML的格式?

例如:默认的数据格式是使用毫秒<StartDate>2012-08-21T13:21:58.000Z</StartDate>我需要省略毫秒。 <StartDate>2012-08-21T13:21:58Z</StartDate>

我怎样才能指定我想要它使用的输出格式/date格式? 我使用javax.xml.datatype.DatatypeFactory来创buildXMLGregorianCalendar对象。

 XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal); 

您可以使用XmlAdapter来自定义如何将datetypes写入XML。

 import java.text.SimpleDateFormat; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DateAdapter extends XmlAdapter<String, Date> { private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public String marshal(Date v) throws Exception { synchronized (dateFormat) { return dateFormat.format(v); } } @Override public Date unmarshal(String v) throws Exception { synchronized (dateFormat) { return dateFormat.parse(v); } } } 

然后,使用@XmlJavaTypeAdapter注释来指定XmlAdapter应该用于特定的字段/属性。

 @XmlElement(name = "timestamp", required = true) @XmlJavaTypeAdapter(DateAdapter.class) protected Date timestamp; 

使用xjb绑定文件:

 <jxb:javaType name="java.time.ZonedDateTime" xmlType="xs:dateTime" parseMethod="my.package.DateAdapter.parseDateTime" printMethod="my.package.DateAdapter.formatDateTime" /> 

会产生上述的注解。

我使用SimpleDateFormat创buildXMLGregorianCalendar,如下例所示:

 public static XMLGregorianCalendar getXmlDate(Date date) throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(date)); } public static XMLGregorianCalendar getXmlDateTime(Date date) throws DatatypeConfigurationException { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(date)); } 

第一种方法创buildXMLGregorianCalendar的实例,该实例由XML编组器格式化为有效的xsd:date,第二种方法导致有效的xsd:dateTime。

非常简单的方法给我。 格式化XMLGregorianCalendar以在java中进行编组。

我只是以良好的格式创build我的数据。 toString将被称为产生好的结果。

 public static final XMLGregorianCalendar getDate(Date d) { try { return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(d)); } catch (DatatypeConfigurationException e) { return null; } }