2015-09-28 12 views
13

पार्स कर रहा है मैं क्लाइंट पक्ष में दिनांक को सत्यापित करना चाहता था इसलिए मैंने निम्नलिखित कोड लिखा। लेकिन अपवाद प्राप्त करने के बजाय मुझे 31 फरवरी की तारीख स्ट्रिंग के लिए उचित तिथि वस्तु मिल रही है, जो स्पष्ट रूप से एक अमान्य तिथि है।जावा 8 लोकलडेटाइम अमान्य दिनांक

public class Test { 

    public static void main(String[] args) { 
     String dateFormat = "HH:mm:ss MM/dd/yyyy"; 
     String dateString = "11:30:59 02/31/2015"; 
     DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat, Locale.US); 
     try { 
      LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter); 
      System.out.println(date); 
     } catch (Exception e) { 
      // Throw invalid date message 
     } 
    } 
} 

आउटपुट: 2015-02-28T11: 30: 59

क्या किसी को पता है कि क्यों LocalDateTime इस तिथि को पार्स है के बजाय एक अपवाद फेंक।

+0

आप अपवाद के लिए क्यों इंतजार कर रहे हैं? – Andrew

+2

@AndrewTobilko, संभवतः 31 फरवरी। मौजूद नहीं है। – aioobe

+0

लेकिन फ़ॉर्मेटर को इसके बारे में पता नहीं है। – Satya

उत्तर

21

आपको बस सख्त ResolverStyle की आवश्यकता है।

एक पाठ स्ट्रिंग को पार्स करना दो चरणों में होता है। चरण 1 बिल्डर में जोड़े गए फ़ील्ड के अनुसार एक मूल पाठ पार्स है। चरण 2 पार्स किए गए फ़ील्ड-वैल्यू जोड़े को दिनांक और/या समय ऑब्जेक्ट में हल करता है। इस शैली का उपयोग यह नियंत्रित करने के लिए किया जाता है कि कैसे चरण 2, हल हो रहा है, होता है।

नमूना कोड - जहां withResolverStyle(ResolverStyle.STRICT) महत्वपूर्ण परिवर्तन है, बजाय yyyyuuuu के उपयोग के साथ (जहां uuuu "वर्ष" और "yyyy" है "युग का वर्ष" है, और इसलिए अस्पष्ट):

import java.time.*; 
import java.time.format.*; 
import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     String dateFormat = "HH:mm:ss MM/dd/uuuu"; 
     String dateString = "11:30:59 02/31/2015"; 
     DateTimeFormatter dateTimeFormatter = DateTimeFormatter 
      .ofPattern(dateFormat, Locale.US) 
      .withResolverStyle(ResolverStyle.STRICT); 
     try { 
      LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter); 
      System.out.println(date); 
     } catch (DateTimeParseException e) { 
      // Throw invalid date message 
      System.out.println("Exception was thrown"); 
     } 
    } 
} 
+3

yyyy को uuuu में प्रारूप स्ट्रिंग में बदलें, फिर ERA – Palamino

+0

@Palamino के साथ गड़बड़ करने की कोई आवश्यकता नहीं है: आह! अच्छी तरह से किया, धन्यवाद। –

0

LocalDateTime.parse केवल एक त्रुटि, 31 या एक महीने से अधिक दिनों की संख्या 12.

उदाहरण के लिए से अधिक है, अगर आप इस तरह के रूप में अपने कोड को संशोधित फेंक देंगे अगर स्ट्रिंग में पारित अमान्य वर्ण हैं:

String dateString = "11:30:59 0zz2/31/2015"; 

आपके द्वारा दी गई तारीख के भीतर अमान्य 'zz' वर्णों के कारण एक अपवाद फेंक दिया जाएगा। यह कहने के लिए तिथि क्यों 'गोल-डाउन' है, कि मुझे नहीं पता।

स्रोत: https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html#parse-java.lang.CharSequence-

+0

विधिवत नोट किया गया और रीयलस्केप्टिक को सही किया गया। – jste89

2
try { 
    SimpleDateFormat df = new java.text.SimpleDateFormat("HH:mm:ss MM/dd/yyyy"); 
    df.setLenient(false); 
    System.out.println(df.parse("11:30:59 02/29/2015")); 
} catch (java.text.ParseException e) { 
    System.out.println(e); 
} 

मैं DateFormat.setLenient(boolean) साथ कोई मान्य दिनांक के रूप में की तारीख पहचान करने के लिए एक समाधान मिल गया। यदि आप किसी भी अमान्य तिथि को पार्स करने का प्रयास करते हैं तो यह पार्स अपवाद फेंक देगा।

संपादित करें:

Java 8, लेकिन अगर एक महीने, 1 और 12 के बीच नहीं है अगर एक दिन 32 से अधिक है इस अपवाद को बढ़ा देंगे। बिल्कुल काम नहीं कर रहा है। लेकिन महीने के लिए यह काम कर रहा है।

try { 
TemporalAccessor ta = DateTimeFormatter.ofPattern("HH:mm:ss MM/dd/yyyy").parse("11:30:59 02/32/2015"); 
} catch (Exception e) { 
System.out.println(e); 
} 

आउटपुट:

java.time.format.DateTimeParseException: Text '11:30:59 02/32/2015' could not be 
parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32 
+0

'SimpleDateFormat' जावा 8' लोकलडेट टाइम 'के साथ काम नहीं करता है। मैं Java8 LocalDateTime के साथ समाधान ढूंढ रहा हूं – Zeeshan

7

जावा 8 DateTimeFormatter YEAR_OF_ERA मतलब करने के लिए yyyy का उपयोग करता है, और uuuu साल मतलब करने के लिए। आप इस प्रकार अपने पैटर्न स्ट्रिंग संशोधित करने की आवश्यकता: स्मार्ट समाधानकर्ता शैली का उपयोग करने के लिए

String dateFormat = "HH:mm:ss MM/dd/uuuu"; 

DateTimeFormatter चूक, लेकिन आप इसे सख्त समाधानकर्ता शैली का उपयोग करना चाहते हैं।अपनी तिथि को संशोधित करें टाइमफॉर्मर प्रारंभिक कोड निम्नानुसार:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat, Locale.US) 
                 .withResolverStyle(ResolverStyle.STRICT); 
2

यह गोल नहीं हो रहा है। फरवरी में 31 दिन नहीं थे, और एक दिन का प्रतिनिधित्व करने के लिए एक मान्य दिनांक/समय वस्तु का उपयोग करना असंभव है जो मौजूद नहीं है।

नतीजतन, यह अमान्य इनपुट लेता है और आपको सही तिथि (उस वर्ष फरवरी की अंतिम तिथि) का सबसे अच्छा अनुमान देता है।

SimpleDateFormatDateFormat से विरासत जिसमें setLenient(boolean value) विधि है। मैं उम्मीद करता हूं कि यदि आपने पार्सिंग से पहले setLenient(true) कहा है, तो शायद यह अधिक शिकायत करेगा, as detailed in the javadocs

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