2009-12-15 177 views
40

मैं का उपयोग "yyyyMMdd" के स्ट्रिंग को पार्स करने के लिए कर रहा हूं।SimpleDateFormat.parse() को अमान्य तिथियों पर विफल करें (उदा। माह 12 से अधिक है)

यदि मैं असफल होने की बजाय 12 से अधिक महीने के साथ एक स्ट्रिंग को पार्स करने का प्रयास करता हूं, तो यह अगले वर्ष तक चलता है। पूर्ण runnable रेप्रो:

import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ParseDateTest { 

    public static void main(String[] args) throws ParseException { 

     SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); 
     Date result = format.parse("20091504"); // <- should not be a valid date! 
     System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010 
    } 
} 

मैं नहीं बल्कि एक ParseException फेंक दिया होगा।

क्या अपवाद को मजबूर करने का कोई गैर-हैकी तरीका है? मेरा मतलब है, मैं मैन्युअल रूप से जांचना नहीं चाहता कि महीने 12 से अधिक है या नहीं। यह हास्यास्पद है।

किसी भी सुझाव के लिए धन्यवाद।

नोट: मुझे पहले से ही जोडा समय के बारे में पता है, लेकिन मुझे बाहरी पुस्तकालयों के बिना सादे जेडीके में यह करने की ज़रूरत है।

उत्तर

96

आपको इसे non-lenient बनाने की आवश्यकता है। इस प्रकार,

format.setLenient(false); 

इसे करना चाहिए।

+6

धन्यवाद एक बहुत होगा। वह चाल है। आश्चर्यजनक है कि यहां प्रश्न पूछने से Google पर खोज करने से परिणाम तेज होता है (या मैं खोज में चूसता हूं :)। एक लाइनर के लिए –

+2

+1। –

+2

स्टैक ओवरफ्लो उपयोगकर्ताओं को 1 से अधिक बिंदुओं के उत्तर देने की अनुमति दे सकता है और यह उन उत्तरों में से एक है। मैं 'SimpleDateFormat' के साथ पार्स करने से पहले कुछ हास्यास्पद पैटर्न मिलान कर रहा था। बहुत बहुत धन्यवाद। –

3

आप जावा 8 टाइम एपीआई का उपयोग कर सकते हैं। उदाहरण के द्वारा आप 15 के एक मूल्य के साथ एक महीने का उपयोग करते हैं:

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 
संबंधित मुद्दे