当JAXB乘警约会对象( XMLGregorianCalendar
)为一个xsd:日期时间元素你怎么可以指定生成的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。
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创建的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));
}
所述第一方法创建由XML编组为一个有效的xsd格式化的XMLGregorianCalendar的实例:日期,在一个有效的xsd第二种方法的结果:日期时间。
非常简单的方法给我。 格式化的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;
}
}
https://www.baeldung.com/jaxb
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;
localdateadapt是
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);
}
}