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