如何指定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; } }