当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);
答案 0 :(得分:119)
您可以使用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" />
将产生上述注释。
答案 1 :(得分:16)
我使用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。
答案 2 :(得分:2)
对我很简单。格式化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;
}
}
答案 3 :(得分:0)
render() {
const { inputs, addInput, handleChangeInput } = this.props;
return (
<List>
{inputs.map((item, index) => (
<ListItem key={index} >
<Input
autoFocus={true}
value={item}
inputRef={this.refs[index]}
onChange={(event) => handleChangeInput (index, event)}
onKeyPress= {(event) => {
if (event.key === 'Enter') {
this.changeFocus(index);
}
}}
// autoFocus
/>
</ListItem>
))}
</List>
);
}
答案 4 :(得分:0)
用法:
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);
}
}