2009-05-07 11 views

risposta

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

E 'per tu col getInstance() come una variabile statica in qualche classe convertitore? Ho provato a cercarlo nel JavaDoc ma non ho trovato nulla. Difficile sapere se ci saranno problemi nell'uso simultaneo? – Martin

+32

Se si desidera utilizzare JodaTime, è possibile farlo in una riga: DatatypeFactory.newInstance(). NewXMLGregorianCalendar (new DateTime(). ToGregorianCalendar()) –

+3

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

29

Ecco un metodo per convertire da un GregorianCalendar a XMLGregorianCalendar; Lascio la parte di conversione da un java.util.Date a GregorianCalendar come un esercizio per voi:

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

Questa una soluzione per convertire CregorianCalendar a XMLGregorianCalendar e non quello indicato nella domanda – ftrujillo

10

Spero che la mia codifica qui è giusto; D per renderlo più veloce basta usare la chiamata brutto getInstance() di GregorianCalendar invece di chiamata del costruttore:

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 per utilizzare .getInstance(). 'GregorianCalendar.getInstance()' è l'equivalente di 'Calendar.getInstance()'. 'Calendar.getInstance()' non può renderlo più veloce, perché usa lo stesso 'nuovo GregorianCalendar()', ma prima controlla anche le impostazioni locali predefinite e può creare invece un calendario giapponese o Buddish, quindi per alcuni fortunati utenti sarà 'ClassCastException'! – kan

194

per coloro che potrebbero finire qui alla ricerca per la conversione opposta (da XMLGregorianCalendar a Date):

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

Ho appena pensato di aggiungere la mia soluzione di seguito, poiché le risposte di cui sopra non hanno soddisfatto le mie esigenze. Il mio schema Xml richiedeva elementi separati di data e ora, non un singolo campo DateTime. Il costruttore standard XMLGregorianCalendar utilizzato sopra genererà un campo DateTime

Nota un paio di gothca's, come dover aggiungere uno al mese (poiché java conta mesi da 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

Supponendo che si sta decodifica o codifica XML e utilizzando JAXB, allora è possibile sostituire il dateTime legame del tutto e utilizzare qualcosa di diverso `XMLGregorianCalendar' per ogni data nello schema.

In questo modo è possibile avere JAXB fare le cose ripetitive mentre si può passare il tempo a scrivere codice fantastico che offre valore.

Esempio di jodatime DateTime: (. Fare questo con java.util.Date sarebbe anche lavorare - ma con alcune limitazioni preferisco jodatime e viene copiato dal mio codice in modo so che funziona ...)

<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> 

e il convertitore:

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

Vedi qui: how replace XmlGregorianCalendar by Date?

Se siete felici di mappare solo ad un istante basato sul fuso orario + timestamp, e il fuso orario originale non è veramente rilevante, quindi probabilmente anche java.util.Date va bene.

19

Un esempio di una linea utilizzando Joda-Time libreria:

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

credito alla Nicolas Mommaerts dal suo commento in the accepted answer.

-1

Partenza questo codice: -

/* 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); 

Si può vedere esempio completo here

+0

non credo che questa risposta fornisce nulla di nuovo .. Forse si può modificare la risposta precedente, invece di postare un altro quasi lo stesso. – winter

Problemi correlati