java.util.Fecha a XMLGregorianCalendar

¿No hay una manera conveniente de pasar de java.util.Date a XMLGregorianCalendar?

GregorianCalendar c = new GregorianCalendar(); c.setTime(yourDate); XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c); 

Para aquellos que podrían terminar aquí buscando la conversión opuesta (de XMLGregorianCalendar a Date ):

 XMLGregorianCalendar xcal = ; java.util.Date dt = xcal.toGregorianCalendar().getTime(); 

Aquí hay un método para convertir de un Calendario Gregorian a XMLGregorianCalendar; Dejaré la parte de convertir de java.util.Date a GregorianCalendar como ejercicio para usted:

 import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; public class DateTest { public static void main(final String[] args) throws Exception { GregorianCalendar gcal = new GregorianCalendar(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

EDITAR: Slooow 🙂

Un ejemplo de una línea utilizando la biblioteca Joda-Time :

 XMLGregorianCalendar xgc = DatatypeFactory.newInstance().newXMLGregorianCalendar(new DateTime().toGregorianCalendar()); 

Gracias a Nicolas Mommaerts por su comentario en la respuesta aceptada .

Solo pensé en agregar mi solución a continuación, ya que las respuestas anteriores no satisfacían mis necesidades exactas. Mi esquema Xml requería elementos de fecha y hora separados, no un campo de fecha y hora único. El constructor XMLGregorianCalendar estándar utilizado anteriormente generará un campo DateTime

Tenga en cuenta que hay un par de gothca, como tener que agregar uno al mes (ya que java cuenta meses desde 0).

 GregorianCalendar cal = new GregorianCalendar(); cal.setTime(yourDate); XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), 0); XMLGregorianCalendar xmlTime = DatatypeFactory.newInstance().newXMLGregorianCalendarTime(cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND), 0); 

Espero que mi encoding aquí sea la correcta; D Para hacerlo más rápido solo use la fea llamada getInstance () de GregorianCalendar en lugar de llamar al constructor:

 import java.util.GregorianCalendar; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; public class DateTest { public static void main(final String[] args) throws Exception { // do not forget the type cast :/ GregorianCalendar gcal = (GregorianCalendar) GregorianCalendar.getInstance(); XMLGregorianCalendar xgcal = DatatypeFactory.newInstance() .newXMLGregorianCalendar(gcal); System.out.println(xgcal); } } 

Suponiendo que está decodificando o codificando xml y usando JAXB , entonces es posible reemplazar el enlace de fecha y hora por completo y usar algo más que `XMLGregorianCalendar ‘para cada fecha en el esquema.

De esa manera, puede hacer que JAXB haga las cosas repetitivas, mientras que puede dedicar tiempo a escribir un código impresionante que genere valor.

Ejemplo de jodatime DateTime : (Hacer esto con java.util.Date también funcionaría, pero con ciertas limitaciones. Prefiero jodatime y se copia de mi código, así sé que funciona …)

       

Y el convertidor:

 public class JaxbConverter { static final DateTimeFormatter dtf = ISODateTimeFormat.dateTimeNoMillis(); static final DateTimeFormatter df = ISODateTimeFormat.date(); static final DateTimeFormatter tf = ISODateTimeFormat.time(); public static LocalDateTime parseDateTime(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; LocalDateTime r = dtf.parseLocalDateTime(s); return r; } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printDateTime(LocalDateTime d) { try { if (d == null) return null; return dtf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalDate parseDate(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; return df.parseLocalDate(s); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printDate(LocalDate d) { try { if (d == null) return null; return df.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static String printTime(LocalTime d) { try { if (d == null) return null; return tf.print(d); } catch (Exception e) { throw new IllegalArgumentException(e); } } public static LocalTime parseTime(String s) { try { if (StringUtils.trimToEmpty(s).isEmpty()) return null; return df.parseLocalTime(s); } catch (Exception e) { throw new IllegalArgumentException(e); } } 

Vea aquí: ¿cómo reemplazar XmlGregorianCalendar por fecha?

Si está feliz de hacer un mapa de un instante basado en la zona horaria + marca de tiempo, y la zona horaria original no es realmente relevante, entonces java.util.Date probablemente también esté bien.

Mira este código: –

 /* Create Date Object */ Date date = new Date(); XMLGregorianCalendar xmlDate = null; GregorianCalendar gc = new GregorianCalendar(); gc.setTime(date); try{ xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); } catch(Exception e){ e.printStackTrace(); } System.out.println("XMLGregorianCalendar :- " + xmlDate); 

Puedes ver el ejemplo completo aquí