2011-01-18 4 views
11

मुझे जावा में "10 जनवरी, 2010" प्रारूप की तिथियों को पार्स करने की आवश्यकता है। मैं यह कैसे कर सकता हूँ?जावा में "10 जनवरी, 2010" प्रारूप की पार्सिंग तिथियां? (सामान्य संकेतक के साथ, सेंट | nd | rd | th)

ordinal indicators कैसे संभाल करने के लिए, st, nd, rd, या th दिन संख्या अनुगामी?

+2

समस्या "वें" (और संभवतः "rd" और "nd") है, है ना? – Thilo

+0

हर कोई Thanx ... यह पात्रों से बचकर काम कर रहा है। – srinivasarao

उत्तर

9

यह काम करता है:

String s = "January 10th, 2010"; 
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy"); 
System.out.println("" + dateFormat.parse(s.replaceAll("(?:st|nd|rd|th),", ""))); 

लेकिन क्या आप वाकई सही Locale उपयोग कर रहे हैं ठीक से महीने के नाम पार्स करने के लिए बनाने की जरूरत है।

मुझे पता है कि आप SimpleDateFormat पैटर्न के अंदर सामान्य ग्रंथों को शामिल कर सकते हैं। हालांकि इस मामले में पाठ जानकारी पर निर्भर है और वास्तव में पार्सिंग प्रक्रिया के लिए प्रासंगिक नहीं है।

यह वास्तव में सबसे सरल समाधान है जिसे मैं सोच सकता हूं। लेकिन मुझे गलत दिखाना अच्छा लगेगा।

आप इस के लिए इसी तरह कुछ कर रही द्वारा टिप्पणियों में से एक में उजागर चूकों से बच सकते:

String s = "January 10th, 2010"; 
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy"); 
System.out.println("" + dateFormat.parse(s.replaceAll("(?<= \\d+)(?:st|nd|rd|th),(?= \\d+$)", ""))); 

यह आपको उदाहरण के लिए Jath,uary 10 2010 से मेल नहीं करने की अनुमति देगा।

+2

मुझे पता है कि आप 'SimpleDataFormat' पैटर्न के अंदर सामान्य ग्रंथों को शामिल कर सकते हैं। हालांकि इस मामले में पाठ जानकारी पर निर्भर है और वास्तव में पार्सिंग प्रक्रिया के लिए प्रासंगिक नहीं है। मुझे पता है कि सबसे सरल समाधान यह है। लेकिन मुझे गलत दिखाना अच्छा लगेगा। –

+0

'अगस्त' के लिए भी काम करता है। ;-) –

+0

@ माइकल ... जानना अच्छा है। –

1

आप आदि को SimpleDateFormat में अक्षर के रूप में सेट कर सकते हैं। आप चार आवश्यक प्रारूप को परिभाषित कर सकते हैं और उन्हें आज़मा सकते हैं। th से पहले शुरू करना, क्योंकि मुझे लगता है कि यह अधिक बार होता है। यदि यह ParseException के साथ विफल रहता है, तो अगला प्रयास करें। अगर सब असफल हो जाते हैं, तो ParseException फेंक दें। यहां कोड सिर्फ एक अवधारणा है। वास्तविक जीवन में आप प्रारूपों को हर समय नए उत्पन्न नहीं कर सकते हैं और थ्रेड-सुरक्षा के बारे में सोच सकते हैं।

public static Date hoolaHoop(final String dateText) throws ParseException 
     { 
     ParseException pe=null; 
     String[] sss={"th","nd","rd","st"}; 
     for (String special:sss) 
     { 
     SimpleDateFormat sdf=new SimpleDateFormat("MMMM d'"+special+",' yyyy"); 

     try{ 
     return sdf.parse(dateText); 
     } 
     catch (ParseException e) 
     { 
     // remember for throwing later 
     pe=e; 
     } 
     } 
     throw pe; 
     } 
     public static void main (String[] args) throws java.lang.Exception 
     { 
     String[] dateText={"January 10th, 2010","January 1st, 2010","January 2nd, 2010",""}; 
     for (String dt:dateText) {System.out.println(hoolaHoop(dt))}; 
     } 

आउटपुट:

सूर्य जनवरी 10 00:00:00 GMT 2010

शुक्र जनवरी 01 00:00:00 GMT 2010

शनि जनवरी 02 00:00: 00 जीएमटी 2010

थ्रेड "मुख्य" java.text.ParseException में अपवाद: अवांछित दिनांक: ""

"th","nd","rd","st" निश्चित रूप से केवल अंग्रेजी भाषा के साथ लोकेल के लिए उपयुक्त है। यह याद रखना। फ्रांस में, "re","nd" आदि मुझे लगता है।

0

यह एक और आसान तरीका है, लेकिन अपाचे कॉमन्स जार शामिल करने की आवश्यकता है।

import org.apache.commons.lang.time.*; 

String s = "January 10th, 2010"; 
String[] freakyFormat = {"MMM dd'st,' yyyy","MMM dd'nd,' yyyy","MMM dd'th,' yyyy","MMM dd'rd,' yyyy"}; 
DateUtils du = new DateUtils(); 
System.out.println("" + du.parseDate(s,freakyFormat)); 
संबंधित मुद्दे