parameter - ¿Cómo se especifica el formato de fecha utilizado cuando JAXB mapea a xsd: dateTime?
xsd date format dd/mm/yyyy (3)
Cuando JAXB ordena un objeto de fecha ( XMLGregorianCalendar
) en un elemento xsd: dateTime, ¿cómo se puede especificar el formato del XML resultante?
Por ejemplo: el formato de datos predeterminado es 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);
Muy fácil para mi Formateo de XMLGregorianCalendar para ordenar en java.
Solo creo mis datos en el buen formato. El toString
será llamado 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;
}
}
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 XmlAdapter
debe usar 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 mencionada anteriormente.
Yo uso 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 está formateada por el contador de referencias XML como una xsd: date válida, el segundo método da como resultado una xsd válida: dateTime.