2009-05-07 9 views

उत्तर

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

यह getInstance() कुछ कनवर्टर कक्षा में एक स्थिर चर के रूप में रखने के लिए बचाने के लिए है देख सकते हैं? मैंने जावाडॉक में इसे देखने की कोशिश की लेकिन कुछ भी नहीं मिला। किंडा को यह जानना मुश्किल है कि समवर्ती उपयोग में समस्याएं होंगी? – Martin

+32

आप उपयोग करना JodaTime आप एक पंक्ति में ऐसा कर सकते हैं तैयार हैं, तो:।। DatatypeFactory.newInstance() newXMLGregorianCalendar (। नई दिनांक समय() toGregorianCalendar()) –

+3

XMLGregorianCalendar DATE2 = DatatypeFactory.newInstance() newXMLGregorianCalendar (नई ग्रेगोरी कैलेंडर (YYYY, एमएम, डीडी)); –

29

यहाँ XMLGregorianCalendar करने के लिए एक ग्रेगोरी कैलेंडर से परिवर्तित करने के लिए एक विधि है;

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

} 

संपादित करें: मैं तुम्हारे लिए एक व्यायाम के रूप ग्रेगोरी कैलेंडर के लिए एक java.util.Date से परिवर्तित का हिस्सा छोड़ देंगे slooow :-)

+5

ग्रेगोरियन कैलेंडर को XMLGregorian कैलेंडर में कनवर्ट करने का यह समाधान और .getInstance() का उपयोग करने के लिए – ftrujillo

10

मुझे आशा है कि मेरी एन्कोडिंग यहाँ सही है, डी बनाने के लिए यह तेजी से बस ग्रेगोरी कैलेंडर की बदसूरत getInstance() कॉल निर्माता कॉल के बजाय का उपयोग करें:

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 प्रश्न में इंगित नहीं किया गया है। 'ग्रेगोरियन कैलेंडर .getInstance()' 'calendar.getInstance()' के बराबर है। 'Calendar.getInstance()' इसे तेज़ी से नहीं बना सकता है, क्योंकि यह उसी 'नए ग्रेगोरियन कैलेंडर()' का उपयोग करता है, लेकिन इससे पहले कि यह डिफ़ॉल्ट लोकेल भी जांचता है और इसके बजाय जापानी या बुश कैलेंडर बना सकता है, इसलिए कुछ भाग्यशाली उपयोगकर्ताओं के लिए यह होगा 'ClassCastException'! – kan

194

उन है कि यहाँ खत्म हो सकता है विपरीत रूपांतरण (XMLGregorianCalendar से Date करने के लिए) की तलाश में के लिए:

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

बस मैं नीचे मेरी समाधान जोड़ना होगा, के बाद से उत्तर ऊपर मेरी सटीक आवश्यकताओं को पूरा नहीं किया सोचा। मेरी एक्सएमएल स्कीमा को अलग-अलग दिनांक और समय तत्वों की आवश्यकता होती है, गायक डेटटाइम फ़ील्ड नहीं। मानक XMLGregorianCalendar निर्माता ऊपर उपयोग दिनांक समय क्षेत्र उत्पन्न होगा वहाँ

नोट gothca इस तरह के महीने के लिए एक जोड़ने के लिए (के बाद से जावा 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

मान लिया जाये कि आप डिकोड कर रही हैं या एक्सएमएल एन्कोडिंग और JAXB का उपयोग कर, तो यह पूरी तरह से बाध्यकारी dateTime की जगह और स्कीमा में हर तिथि के लिए `XMLGregorianCalendar 'की तुलना में कुछ और उपयोग करने के लिए संभव है।

इस तरह से आप JAXB दोहरा सकते हैं जब आप मूल्य प्रदान करने वाले भयानक कोड लिखने पर समय व्यतीत कर सकते हैं।

<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> 
- (। लेकिन कुछ सीमाओं के साथ मैं jodatime पसंद करते हैं और यह मेरे कोड से कॉपी किया है तो मैं यह काम करता है पता है ... java.util.Date साथ ऐसा होता भी काम करते हैं): एक jodatime DateTime के लिए

उदाहरण

और कनवर्टर:

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

यहाँ देखें: how replace XmlGregorianCalendar by Date?

तुम सिर्फ मैप करने के लिए खुश हैं, तो टाइमज़ोन + टाइमस्टैम्प के आधार पर एक पल के लिए, और मूल टाइमज़ोन वास्तव में प्रासंगिक नहीं है, तो java.util.Date शायद ठीक है।

19

एक एक लाइन उदाहरण Joda-Time लाइब्रेरी का उपयोग: the accepted answer में अपनी टिप्पणी से Nicolas Mommaerts को

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

क्रेडिट।इस कोड को बाहर

-1

चेक: -

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

आप पूर्ण उदाहरण here

+0

मुझे नहीं लगता कि यह उत्तर कुछ नया नहीं प्रदान करता है .. शायद आप लगभग एक ही पोस्ट करने के बजाय पिछले उत्तर को संपादित कर सकते हैं। – winter

संबंधित मुद्दे