2009-05-07 2 views

Antwort

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

es die getInstance() als eine statische Variable in einem gewissen Konverter Klasse zu halten ist, zu retten? Ich habe versucht, es im JavaDoc nachzuschlagen, konnte aber nichts finden. Ein bisschen schwer zu wissen, ob es Probleme bei der gleichzeitigen Nutzung geben wird? – Martin

+32

Wenn Sie bereit sind, verwenden JodaTime Sie dies in einer Zeile tun:.. DatatypeFactory.newInstance() newXMLGregorianCalendar (. Neue Datetime() toGregorianCalendar()) –

+3

XMLGregorianCalendar date2 = DatatypeFactory.newInstance() newXMLGregorianCalendar (neu GregorianCalendar (YYYY, MM, DD)); –

29

Hier ist ein Verfahren, um aus einem GregorianCalendar zu XMLGregorianCalendar umzuwandeln;

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: Ich werde für Sie den Teil der Umwandlung von einem java.util.Date zu GregorianCalendar als Übung verlassen Slooow :-)

+5

Dies ist eine Lösung zum Konvertieren von GregorianCalendar in XMLGregorianCalendar und nicht das, was in der Frage – ftrujillo

10

Ich hoffe, meine Codierung hier richtig ist; D um es schneller verwenden nur die hässliche getInstance() Aufruf von GregorianCalendar statt Konstruktoraufruf:

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 für die Verwendung von .getInstance() angegeben ist. 'GregorianCalendar.getInstance()' ist das Äquivalent von 'Calendar.getInstance()'. Das 'Calendar.getInstance()' kann es nicht schneller machen, weil es das gleiche 'neue GregorianCalendar()' verwendet, aber vorher auch das Standard-Gebietsschema überprüft und stattdessen einen japanischen oder Buddish-Kalender erstellen kann, also wird es für einige glückliche Benutzer sein 'ClassCastException'! – kan

194

für diejenigen, die hier enden könnte bis suchen die entgegengesetzte Umwandlung (von XMLGregorianCalendar zu Date):

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

Nur gedacht, ich würde meine Lösung unten hinzufügen, da die Antworten nicht meine genauen Bedürfnisse erfüllen. Mein Xml-Schema benötigt separate Date- und Time-Elemente, kein einzelnes DateTime-Feld. Der Standard-XMLGregorianCalendar-Konstruktor, der oben verwendet wird, erzeugt ein DateTime-Feld

Beachten Sie, dass es einige Gothcas gibt, wie zum Beispiel das Hinzufügen eines zum Monat (da Java Monate von 0 zählt).

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

Angenommen, Sie entschlüsseln oder XML-Codierung und JAXB verwendet wird, dann ist es möglich, die Datums- und Uhrzeit Bindung vollständig zu ersetzen und etwas anderes als `XMLGregorianCalendar‘ für jeden Tag im Schema verwenden.

Auf diese Weise können Sie JAXB die repetitiven Sachen tun, während Sie die Zeit verbringen können, um ehrfürchtigen Code zu schreiben, der Wert liefert.

Beispiel für ein jodatime DateTime: (. Dadurch mit java.util.Date würde auch funktionieren - aber mit gewissen Einschränkungen Ich ziehe jodatime und es ist von meinem Code kopiert, so weiß ich, es funktioniert ...)

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

Und der Konverter:

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

hier ansehen: nur zur Karte how replace XmlGregorianCalendar by Date?

Wenn Sie glücklich sind zu einem Zeitpunkt basierend auf der Zeitzone + Zeitstempel, und die ursprüngliche Zeitzone ist nicht wirklich relevant, dann ist java.util.Date wahrscheinlich auch in Ordnung.

19

A eine Zeile Beispiel mit Joda-Time Bibliothek:

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

Credit Nicolas Mommaerts aus seinem Kommentar in the accepted answer.

-1

Schauen Sie sich diesen Code: -

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

können Sie sehen komplettes Beispiel here

+0

Ich denke nicht, dass diese Antwort nichts neues bietet .. Vielleicht können Sie die vorherige Antwort statt Post ein anderes fast gleich bearbeiten. – winter