2012-05-16 17 views
28

साथ W3C XML दिनांकों जावा SimpleDateFormat पैटर्न मैं निम्नलिखितसमय क्षेत्र

"2012-05-15T07:08:09+03:00" 

जो W3C XML Schema dateTime विनिर्देश के आईएसओ 8601 संस्करण के अनुरूप है की तरह एक W3C XML स्कीमा तारीख पार्स करने के लिए कोशिश कर रहा हूँ।

उपर्युक्त दिनांक में, टाइमज़ोन पहचानकर्ता "+03:00" है, लेकिन SimpleDateFormat पैटर्न स्पष्ट रूप से इसका प्रतिनिधित्व करने के लिए मौजूद नहीं है।

तो समय क्षेत्र "+0300", तो Z (अपरकेस) लागू किया जाएगा और SimpleDateFormat पैटर्न

yyyy-MM-dd'T'HH:mm:ssZ 

इसी तरह हो सकता है, अगर समय क्षेत्र "GMT+03:00", तो z (लोअरकेस) थे लागू किया जाएगा और SimpleDateFormat थे पैटर्न

yyyy-MM-dd'T'HH:mm:ssz 

(अपरकेस 'Z' भी काम करता है जिस तरह से) होगा।

तो, क्या SimpleDateFormat पैटर्न या वर्कअराउंड है जो उपरोक्त दिनांक का प्रतिनिधित्व करने के लिए दिनांक स्ट्रिंग के प्रीप्रोकैसिंग के बिना है?

+0

वास्तव में, कि इनपुट स्ट्रिंग से [8601 आईएसओ] (https://en.wikipedia.org/wiki/ISO_8601) मानक (दिनांक-समय प्रारूपों के समूह) एक प्रारूप में है। –

उत्तर

23

कैसे की तरह कुछ के बारे में:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"){ 
    public Date parse(String source,ParsePosition pos) {  
     return super.parse(source.replaceFirst(":(?=[0-9]{2}$)",""),pos); 
    } 
}; 
+0

यह सरल है! – adarshr

+0

चालाक, सुरुचिपूर्ण और कार्यात्मक। धन्यवाद! – PNS

+1

जो भी पार्स() रिटर्न के बाद पारसेपोजिशन का उपयोग करने की आवश्यकता है, आपको इंडेक्स को एक पार्स() से समायोजित करने की आवश्यकता हो सकती है, क्योंकि स्रोत वास्तव में 1 लंबा है, यानी pos.setIndex (pos.getIndex() + 1 जैसा कुछ करें)। – PNS

1

मुझे पूरा यकीन नहीं है कि यह आपके लिए काम करेगा या नहीं। लेकिन यहां कोड मैंने एक टाइमज़ोन से दूसरे टाइमज़ोन में दिनांक परिवर्तित करते समय कोशिश की है। कोड के कुछ भाग आपकी मदद कर सकते हैं।

public Date convertToUserTimezone(long dateToConvert, String timezoneOffset){ 
     java.text.DateFormat format = SimpleDateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);/*new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*/ 
     // java.util.Calendar cal = Calendar.getInstance(new 
     // SimpleTimeZone(0, "GMT+05:30")); 
     TimeZone gmtTime = TimeZone.getTimeZone("GMT"+timezoneOffset); 


     format.setTimeZone(gmtTime); 
     java.util.Date date1 = new Date(format.format(new Date(dateToConvert))); 

     return date1; 
    } 

उम्मीद है कि यह आपकी मदद करता है। चीयर्स। :)

+0

मैं कुछ आसान के बाद था, लेकिन प्रयास के लिए धन्यवाद। :-) – PNS

3

नहीं, SimpleDateFormat स्ट्रिंग से प्रीप्रोसेसिंग किए बिना इस प्रारूप को समझने के लिए कोई कामकाज नहीं है (उदाहरण के लिए स्ट्रिंग से : हटाकर)। (संपादित करें: अगर आप जावा 7 या नए का उपयोग कर रहे हैं जैसा कि assylias द्वारा नोट किया गया है)।

ऐसा लगता है कि आप दिनांक और समय (आईएसओ 8601) के लिए मानक एक्सएमएल प्रारूप में तारों को पार्स करने की कोशिश कर रहे हैं। मैं Joda Time लाइब्रेरी का उपयोग करने की अनुशंसा करता हूं जिसमें support for this format है।

यदि आप किसी कारण से जोडा टाइम का उपयोग नहीं करना चाहते हैं या नहीं चाहते हैं, तो आप इस प्रारूप में टाइमस्टैम्प को पार्स और प्रारूपित करने के लिए पैकेज javax.xml.datatype से कक्षाओं का उपयोग कर सकते हैं। उदाहरण के लिए:

DatatypeFactory factory = DatatypeFactory.newInstance(); 

// Parses a string in ISO 8601 format to an XMLGregorianCalendar 
XMLGregorianCalendar xmlCal = factory.newXMLGregorianCalendar("2012-05-16T10:39:00+03:00"); 

// Convert it to a regular java.util.Calendar 
Calendar cal = xmlCal.toGregorianCalendar(); 
+0

जोडाटाइम Java SimpleDateFormat क्लास का समर्थन करने वाले सभी पैटर्न का समर्थन नहीं करता है। – PNS

+0

@PNS हां लेकिन आप विशेष रूप से आईएसओ 8601 प्रारूप के बारे में पूछ रहे थे। – Jesper

+0

निश्चित रूप से, मैंने बस सीमा को इंगित किया। अन्यथा, जोडाटाइम शायद जाने का रास्ता होगा। – PNS

10

हममम दिनांक स्वरूप एक्सएमएल datetime डेटाप्रकार प्रारूप की तरह दिखता है? यदि यह एक्सएमएल datetime डेटाप्रकार स्वरूप है आप javax.xml.datatype.DatatypeFactory का उपयोग XMLGregorianCalendar

DatatypeFactory 
    .newInstance() 
    .newXMLGregorianCalendar("2012-05-15T07:08:09+03:00"); 

बनाने के लिए ऊपर कॉल XMLGregorianCalendar का उदाहरण देता है आप वस्तु का उपयोग कर सकते GregorianCalendar जैसे अन्य जावा datetime वस्तुओं के लिए कन्वर्ट करने के लिए कर सकते हैं।

33

आप जावा 7+ उपयोग करते हैं, इस पद्धति से काम करना चाहिए (X आईएसओ 8601 समय क्षेत्र के लिए है):

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); 
+0

यह जानना बहुत अच्छा है। मैं अभी भी जावा 1.6- :( – Alvin

+1

जावा 6 के बारे में यहां हूं, लेकिन इसे नोट करने के लिए धन्यवाद। – PNS

+1

इस प्रश्न के दिनांक उदाहरण के लिए सही पैटर्न शायद "yyyy-MM-dd'T'HH: mm होना चाहिए : एसएसएक्स "(यानी, केवल एक 'एक्स') – PNS

1
के साथ संबंध है आप SimpleDateFormat को

पहले से ही प्रारूप पैटर्न का उल्लेख कर चुके हैं और इन्हें परिभाषित किया गया है: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

यदि आप अपनी तिथि के साथ और अधिक करना चाहते हैं तो ग्रेगोरी कैलेंडर आप अधिक विकल्प देता है, उदाहरण के लिए:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssz"); 
Date date = df.parse(stringDate.replaceAll("\\+", "GMT+")); 
2

सबसे अच्छा तरीका है

1

आप की तरह कुछ कोशिश कर सकते हैं, Joda के

org.joda.time.format.ISODateTimeFormat 

सादर का उपयोग करने के लिए है संभावित पैटर्न के साथ Apache commons DateUtils का उपयोग करें। पूर्व:

private static final String[] DATE_FORMATS = new String[] { 
      "yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ssz", 
      "yyyy-MM-dd'T'HH:mm:ssZ", "yyyy-MM-ddz", "yyyy-MM-ddZ" }; 


    public Date parse(String date) { 

     Date parsedDate = null; 
     try { 
      parsedDate = DateUtils.parseDate(date, DATE_FORMATS); 
     } catch (ParseException e) { 
      logger.error("dates should be in valid format" + e); 
      return null; 
     } 
       return parsedDate; 
       } 
+0

निश्चित रूप से, लेकिन मैं सोच रहा था कि यह प्रीप्रोकैसिंग के बिना किया जा सकता है या नहीं। – PNS

3

:

TimeZone zone = TimeZone.getTimeZone(TimeZone.getTimeZone("GMT-8").getID()); 
GregorianCalendar calendar = new GregorianCalendar(zone); 
calendar.setTime(new Date(SomeDate));