java.time.format.DateTimeParseException को जावा 8 से जावा 11 में माइग्रेट नहीं किया जा सका।

Sep 02 2020

यह जावा 8 में काम करता है

LocalDateTime ldt = LocalDateTime.parse("4/11/17 00:00 AM", DateTimeFormatter.ofPattern("d/M/yy hh:mm[ ][a]"));

लेकिन जावा 11 में मुझे मिलता है

java.time.format.DateTimeParseException: Text '4/11/17 00:00 AM' could not be parsed, unparsed text found at index 14
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)

क्या कोई मुझे यह समझने में मदद कर सकता है कि यह क्यों है? मैंने डॉक्स की जाँच कर ली है और DateTimeFormatter वर्ग में कोई स्पष्ट परिवर्तन नहीं देख रहा हूँ।

https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/format/DateTimeFormatter.html

जवाब

9 rzwitserloot Sep 02 2020 at 18:40

कुछ नहीं बदला। आप 'डिफ़ॉल्ट प्लेटफ़ॉर्म' कोड शैली त्रुटि कर रहे हैं। यह एक विरोधी पैटर्न है जहां आप एक टूटी हुई विधि का उपयोग करते हैं और अपने कोड को तोड़ते हैं, लेकिन यूनिट परीक्षणों के साथ बग को ढूंढना लगभग असंभव है; आपका कोड उत्पादन के समय समाप्त हो जाएगा जब बहुत सारी नकदी और प्रतिष्ठा लाइन में होगी। "सौभाग्य से", आपने जेडडीके को स्विच करके और भाग्यशाली पाया कि आज के जेडडीके इंस्टॉलेशन के बीच लोकल कॉन्फ़िगरेशन कुछ अलग हैं।

मेरा सुझाव है कि आप इन बुरी पद्धतियों के प्रति एक नापसंद के रूप में विकसित होते हैं जैसा कि मैं करता हूं :) ये विधियां हैं जो कुछ पैरामीटर को मानती हैं कि 'जो भी आपके मंच के लिए इस मान के लिए डिफ़ॉल्ट है', और 3 सामान्य अपराधी हैं, में गण:

  • चारसेट एन्कोडिंग
  • स्थान
  • समय क्षेत्र

ofPattern(String)एक ऐसी विधि है; यह 'प्लेटफ़ॉर्म डिफ़ॉल्ट लोकेल' को मानता है, और जाहिर है, आपके JDK8 इंस्टॉल पर, यह अंग्रेजी या कुछ इसी तरह का है और आपके JDK11 इंस्टाल पर यह नहीं है। AMएक aक्षेत्र के लिए मूल्य के रूप में पार्स करना स्थानीय निर्भर है; जाहिर है, AM एक अंग्रेजीवाद है, यह डच या फ्रेंच में कोई मतलब नहीं होगा!

इस समस्या को ठीक करने के लिए 2 चीजें हैं:

  1. यदि आपके IDE में 'आप वास्तव में कभी भी इसे कॉल न करें' के रूप में एक विधि को चिह्नित करने की विशेषताएं हैं, तो आपको सूची में इन सभी तरीकों को जोड़ने पर दृढ़ता से विचार करना चाहिए, और यदि आप तब प्लेटफ़ॉर्म डिफ़ॉल्ट चाहते हैं, तो आप स्पष्ट रूप से Charset.defaultCharset()इसके बजाय चीजों का उपयोग करें , स्पष्ट है कि आप वास्तव में चाहते हैं।

  2. , Locale.ENGLISHअपने पैटर्न के बाद shoving द्वारा अपने कोड को ठीक करें और सभी फिर से बारिश के रूप में सही हो जाएगा।

एक उदाहरण:

LocalDateTime ldt = LocalDateTime.parse("4/11/17 00:00 AM",
  DateTimeFormatter.ofPattern("d/M/yy hh:mm[ ][a]",
  Locale.forLanguageTag("NL")));

JDK8 पर उतना ही विफल रहेगा जितना कि JDK11 पर होता है।

LocalDateTime ldt = LocalDateTime.parse("4/11/17 00:00 AM",
  DateTimeFormatter.ofPattern("d/M/yy hh:mm[ ][a]",
  Locale.ENGLISH));

JDK8 और JDK11 पर भी काम करता है।

ध्यान दें: इस तरह के रूप गैर-अंग्रेजी स्थलों का एक गुच्छा .GERMANYऔर .ITALYऔर .FRANCEवास्तव में सही ढंग किसी भी तरह पार्स AM करते हैं, लेकिन जैसा कि ऊपर दिखाया, डच (नीदरलैंड) एक उदाहरण है जहां कि नहीं होगा काम है।