XMLGregorianCalendar

De ChuWiki

Cuando en un WSDL de un Web Service ponemos el siguiente tipo xs:dateTime

xs:element name="Time" nillable="true" type="xs:dateTime" />

y generamos el código java con cualquier herramienta estilo wsdl2java, en java se genera un tipo XMLGregorianCalendar

@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar time;

Veamos aquí cómo manejar este tipo.


Crear un XMLGregorianCalendar[editar]

La forma de crear un XMLGregorianCalendar con la fecha actual puede ser como la siguiente

 // Un GregorianCalendar con la fecha actual. Si vale la zona horaria por defecto, se llamaría a new GregorianCalendar()
 // sin parámetros.
 GregorianCalendar ahora = new GregorianCalendar(TimeZone.getTimeZone("GMT"));

 XMLGregorianCalendar fecha = DatatypeFactory.newInstance().newXMLGregorianCalendar(ahora);

Hay varias variantes del método newXMLGregorianCalendar() en que se pueden pasar otro tipo de parámetros, como un String que represente la fecha hora, al año, mes, día, hora, minutos y segundos, etc. Sin embargo, esta es la forma más cómoda de obtener la fecha/hora actual.

Si tenemos un java.sql.Timestamp, por ejemplo, obtenido de base de datos, se pueden usar los métodos setTime() de GregorianCalendar

GregorianCalendar unGregorianCalendar = new GregorianCalendar();
unGregorianCalendar.setTime(elTimeStamp);
XMLGregorianCalendar fecha = DatatypeFactory.newInstance().newXMLGregorianCalendar(unGregorianCalendar);

También se pueden usar los métodos unGregorianCalendar.setTime(Date) o unGregorianCalendar.setTimeInMillis(long), o los que llevan toda la paramétrica de año, mes, día, hora, minuto y segundo.

Obtener la fecha a partir del XMLGregorianCalendar[editar]

Si tenemos un XMLGregorianCalendar que hemos leído, por ejemplo, de un Web Service, podemos obtener los tipos de fechas habituales de java (Calendar, Date, Timestamp), obteniendo el long correspondiente al número de milisegundos desde el 1 de Enero de 1970 de la siguiente forma

long milis = unXmlGregorianCalendar.toGregorianCalendar().getTimeInMillis()

A partir de aquí es fácil obtener cualquiera de los otros tipos

Date date = new Date(milis);
Timestamp timestamp = new Timestamp(milis);
Calendar calendar = Calendar.getInstance().setTimeInMillis(milis);

Enlaces[editar]