2012-10-26 25 views
17

SimpleDateFormat एक बहुत दयालु पार्सर कि जिसके परिणामस्वरूप तारीख रोल एक त्रुटि फेंक के बजाय है। मैं regexps आदि के बिना सख्ती से एक तारीख कैसे पार्स कर सकते हैं?जावा: एक तिथि को सख्ती से कैसे पार्स करें?

fmt = new SimpleDateFormat("dd.MM.yyyy") 
fmt.parse("10.11.2012") // it works 
fmt.parse("10.1150.2012") // it works but it's unwanted 
+3

यह आपकी समस्या का समाधान हो सकता है या नहीं भी हो सकता है, लेकिन यदि आप जावा में तिथियों से निपट रहे हैं, तो मैं जोर से जोर देता हूं कि जोडा टाइम लाइब्रेरी – Eduardo

उत्तर

31

fmt.setLenient(false); वह है जो आप खोज रहे हैं।

+6

दुर्भाग्य से लेनदेन झूठी सेटिंग अभी भी लचीला है। "Yyyy/MM/dd" पैटर्न के लिए "2010/01/5" की अनुमति है। 20100901andGarbage YYYYMMDD "पैटर्न के लिए अनुमति दी है" "। मैं एक जवाब सख्त मैचों की गारंटी देता है कि एक वर्ग है कि SimpleDateFormat फैली का उपयोग कर पोस्ट किया है। –

+0

java.text.DateFormat.parse के डॉक ने कहा," विधि के पूरे पाठ का उपयोग नहीं कर सकते हैं दी गई स्ट्रिंग। ", तो व्यवहार सही है। – Germinate

9

java.time

तुम भी जावा 8 में java.time package और बाद में (Tutorial) का उपयोग कर सकते हैं। इसका पार्सिंग तिथि मानों की सख्ती से जांच करता है।

उदाहरण के लिए:

String strDate = "20091504"; 
TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 

सीधे देता है:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20091504' could not be parsed: 
Invalid value for MonthOfYear (valid values 1 - 12): 15 
+0

'डेटटाइमफॉर्मेटर' में तीन रिज़ॉल्वर शैलियों ('डेटफॉर्मैट के दो की तुलना में) हैं: सख्त, स्मार्ट और उदार। सौभाग्य से स्मार्ट डिफ़ॉल्ट है, यह सबसे अवांछित इनपुट, और शायद सबकुछ पकड़ लेगा स्पष्ट रूप से सही नहीं है। अभी भी सख्त सत्यापन के लिए आप निश्चित रूप से सख्त समाधानकर्ता शैली की कोशिश कर सकते हैं। [documentatio] (http://docs.oracle.com/javase/8/docs/api/java/time/format/ResolverStyle.html) बल्कि जानकारीपूर्ण है। –

2

दुर्भाग्य fmt.setLenient (गलत); सख्त तारीख स्वरूपण प्राप्त नहीं करेगा। यह कुछ मदद करता है उदाहरण के पार्स करने के लिए "2010-09-01" प्रारूप का उपयोग "YYYYMMDD" सफल होगा अगर उदार == सच है, लेकिन परिणाम बहुत विचित्र है: 2009/12/09।

यहां तक ​​कि अगर उदार == झूठी पार्स() अभी भी उदार कार्य करता है। "Yyyy/MM/dd" पैटर्न के लिए "2010/01/5" की अनुमति है। और "yyyy/yyyy" पैटर्न के लिए "1999/2011" जैसे डेटा असहमति को सहन किया जाता है (2011 को प्रस्तुत करना)। पैटर्न मैच के बाद कचरा भी अनुमति है। उदाहरण के लिए: "20100901" और "20100901andGarbage" दोनों "yyyyMMdd" से मेल खाते हैं।

मैं SimpleDateFormat का ही विस्तार है कि सख्त पैटर्न मिलान लागू करता है लिखा है।)

SimpleDateFormat.parse() ignores the number of characters in pattern

मेरी संस्करण स्वरूप में() और पार्स (कार्यात्मक प्रतिलोम हैं: आप इसे यहाँ पा सकते हैं। यही वह है जो मुझे लगता है कि ज्यादातर लोग उम्मीद करेंगे।