¿Cómo se especifica el formato de fecha utilizado cuando JAXB marshals xsd: DateTime?


Cuando JAXB envía un objeto date (XMLGregorianCalendar) a un elemento xsd:DateTime ¿cómo puede especificar el formato del XML resultante?

Por ejemplo: El formato de datos predeterminado es utiliza milisegundos <StartDate>2012-08-21T13:21:58.000Z</StartDate> Necesito omitir los milisegundos. <StartDate>2012-08-21T13:21:58Z</StartDate>

¿Cómo puedo especificar el formato de salida/fecha que quiero que use? Estoy usando javax.xml.datatype.DatatypeFactory para crear el objeto XMLGregorianCalendar.

XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);
Author: Xstian, 2012-11-26

3 answers

Puede usar un XmlAdapter para personalizar cómo se escribe un tipo de fecha en 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);
        }
    }

}

Luego usa la anotación @XmlJavaTypeAdapter para especificar que el XmlAdapter debe ser usado para un campo/propiedad específico.

@XmlElement(name = "timestamp", required = true) 
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date timestamp; 

Usando un archivo de enlace xjb:

<jxb:javaType name="java.time.ZonedDateTime" 
              xmlType="xs:dateTime"

    parseMethod="my.package.DateAdapter.parseDateTime"
    printMethod="my.package.DateAdapter.formatDateTime" />

Producirá la anotación antes mencionada.

 112
Author: Blaise Doughan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-09 12:59:15

Utilizo un SimpleDateFormat para crear el XMLGregorianCalendar, como en este ejemplo:

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

El primer método crea una instancia de XMLGregorianCalendar que es formateada por el marshaller XML como un xsd:date válido, el segundo método da como resultado un xsd:DateTime válido.

 15
Author: Andrea Luciano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 23:08:09

Muy fácil para mí. Formateo de XMLGregorianCalendar para marshalling en java.

Solo creo mis datos en el buen formato. El toString se llamará produciendo el buen resultado.

public static final XMLGregorianCalendar getDate(Date d) {
    try {
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd").format(d));
    } catch (DatatypeConfigurationException e) {
        return null;
    }
}
 1
Author: Iván,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-28 08:36:56