如何指定JAXB封送xsd:dateTime时使用的日期格式?

时间:2012-11-26 16:03:37

标签: datetime jaxb format marshalling milliseconds

当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);

5 个答案:

答案 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)

https://www.baeldung.com/jaxb

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);
    }
}