当JAXB将日期对象(XMLGregorianCalendar
)编组到xsd:dateTime元素中时。您如何指定生成的XML的格式?
例如:默认数据格式使用毫秒<StartDate>2012-08-21T13:21:58.000Z</StartDate>
我需要省略毫秒。 <StartDate>2012-08-21T13:21:58Z</StartDate>
如何指定要使用的输出格式/日期格式?我正在使用javax.xml.datatype.DatatypeFactory
创建XMLGregorianCalendar
对象。
XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);
您可以使用XmlAdapter
自定义日期类型如何写入XML。
package com.example;
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绑定文件:
<xjc:javaType name="java.util.Date" xmlType="xs:dateTime"
adapter="com.example.DateAdapter"/>
将产生上述注释。(最终添加xjc
命名空间:xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
)
我使用SimpleDateFormat创建XMLGregorianCalendar,例如在此示例中:
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));
}
[第一种方法创建XMLGregorianCalendar的实例,该实例由XML marshaller格式化为有效的xsd:date,第二种方法产生有效的xsd:dateTime。
对我来说很简单。格式化XMLGregorianCalendar以在Java中进行编组。
我只是以良好的格式创建数据。 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;
}
}
public class DateAdapter extends XmlAdapter<String, Date> {
private static final ThreadLocal<DateFormat> dateFormat
= new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}
@Override
public Date unmarshal(String v) throws Exception {
return dateFormat.get().parse(v);
}
@Override
public String marshal(Date v) throws Exception {
return dateFormat.get().format(v);
}
}
用法:
import com.company.LocalDateAdapter.yyyyMMdd;
...
@XmlElement(name = "PROC-DATE")
@XmlJavaTypeAdapter(yyyyMMdd.class)
private LocalDate processingDate;
LocalDateAdapter
import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class LocalDateAdapter extends XmlAdapter<String, LocalDate> {
public static final class yyyyMMdd extends LocalDateAdapter {
public yyyyMMdd() {
super("yyyyMMdd");
}
}
public static final class yyyy_MM_dd extends LocalDateAdapter {
public yyyy_MM_dd() {
super("yyyy-MM-dd");
}
}
private final DateTimeFormatter formatter;
public LocalDateAdapter(String pattern) {
formatter = DateTimeFormat.forPattern(pattern);
}
@Override
public String marshal(LocalDate date) throws Exception {
return formatter.print(date);
}
@Override
public LocalDate unmarshal(String date) throws Exception {
return formatter.parseLocalDate(date);
}
}