2009-05-07 25 views

Respuesta

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

personal ¿Se Podrán mantener la getInstance() como una variable estática en alguna clase de convertidor? Traté de buscarlo en el JavaDoc pero no pude encontrar nada. ¿Es un poco difícil saber si habrá problemas en el uso simultáneo? – Martin

+32

Si está dispuesto a utilizar JodaTime, puede hacerlo en una línea: DatatypeFactory.newInstance(). NewXMLGregorianCalendar (new DateTime(). ToGregorianCalendar()) –

+3

XMLGregorianCalendar date2 = DatatypeFactory.newInstance(). NewXMLGregorianCalendar (new GregorianCalendar (YYYY, MM, DD)); –

29

Aquí es un método para la conversión de un GregorianCalendar a XMLGregorianCalendar; Voy a dejar la parte de la conversión de un java.util.Date a GregorianCalendar como un 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); 
    } 

} 

EDIT: Slooow :-)

+5

Esta es una solución para convertir GregorianCalendar a XMLGregorianCalendar y no lo que se indica en la pregunta – ftrujillo

10

espero que mi codificación aquí es correcto; D para hacerlo más rápido sólo tiene que utilizar la llamada fea getInstance() de GregorianCalendar en lugar de llamada 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); 
    } 

} 
+11

-1 para usar .getInstance(). 'GregorianCalendar.getInstance()' es el equivalente de 'Calendar.getInstance()'. El 'Calendar.getInstance()' no puede hacerlo más rápido, porque usa el mismo 'nuevo GregorianCalendar()', pero antes también verifica la configuración regional predeterminada y puede crear un calendario japonés o budista, por lo que para algunos usuarios afortunados será 'ClassCastException'! – kan

194

para aquellos que podrían terminar aquí en busca de la conversión opuesta (de XMLGregorianCalendar a Date):

XMLGregorianCalendar xcal = <assume this is initialized>; 
java.util.Date dt = xcal.toGregorianCalendar().getTime(); 
12

Acabo de pensar que agregaría 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 estándar XMLGregorianCalendar 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); 
4

Suponiendo que está descodificación o codificación XML y el uso de JAXB, entonces es posible reemplazar la fechaHora vinculante en su totalidad y utilizar algo más que `XMLGregorianCalendar' para cada fecha en el esquema.

De esta manera, puede hacer que JAXB haga lo repetitivo mientras puede dedicar tiempo a escribir un código impresionante que ofrece valor.

Ejemplo para un JodaTime DateTime: (. Hacer esto con java.util.Date también funcionaría - pero con ciertas limitaciones prefiero JodaTime y ha copiado de mi código, así que sé que funciona ...)

<jxb:globalBindings> 
    <jxb:javaType name="org.joda.time.LocalDateTime" xmlType="xs:dateTime" 
     parseMethod="test.util.JaxbConverter.parseDateTime" 
     printMethod="se.seb.bis.test.util.JaxbConverter.printDateTime" /> 
    <jxb:javaType name="org.joda.time.LocalDate" xmlType="xs:date" 
     parseMethod="test.util.JaxbConverter.parseDate" 
     printMethod="test.util.JaxbConverter.printDate" /> 
    <jxb:javaType name="org.joda.time.LocalTime" xmlType="xs:time" 
     parseMethod="test.util.JaxbConverter.parseTime" 
     printMethod="test.util.JaxbConverter.printTime" /> 
    <jxb:serializable uid="2" /> 
</jxb:globalBindings> 

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

Ver aquí: how replace XmlGregorianCalendar by Date?

Si está satisfecho con solo mapa a 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.

19

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

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

crédito a Nicolas Mommaerts de su comentario en the accepted answer.

-1

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

Se puede ver ejemplo completo here

+0

No creo que esta respuesta no proporcione nada nuevo. Quizás pueda editar la respuesta anterior en lugar de publicar otra casi igual. – winter

Cuestiones relacionadas