java - जावा: डेट पार्सिंग, मुझे एक त्रुटि क्यों मिलती है




date simpledateformat (2)

मुझे आधुनिक उत्तर में योगदान देना चाहिए। क्योंकि मैं SimpleDateFormat के उपयोग को हतोत्साहित करता SimpleDateFormat , इसके बारे में और बाद में।

java.time

    OffsetDateTime dateTime = OffsetDateTime.now(ZoneId.of("Europe/Rome"));
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxx");
    String text = dateTime.format(formatter);
    OffsetDateTime test = OffsetDateTime.parse(text, formatter);

यह 2018-02-07T17:51:21.087+0100 तरह एक स्ट्रिंग का उत्पादन करता है, जो मुझे लगता है कि आप सवाल के बाद थे, और यह अच्छी तरह से वापस पार्स करता है। प्रारूप पैटर्न स्ट्रिंग में SSS साथ यह हमेशा सेकंड पर 3 दशमलव का उत्पादन करता है और पार्सिंग द्वारा वास्तव में 3 दशमलव की आवश्यकता होती है। उदाहरण के लिए, 1 या 6 दशमलव प्राप्त करने के लिए आप S या SSSSSS का उपयोग कर सकते हैं। मेरे जावा 9 पर, OffsetDateTime.now() में 6 दशमलव (माइक्रोसेकंड) की सटीकता है, इसलिए यदि मैं कम निर्दिष्ट करता हूं, तो मैं प्रारूपण में सटीक खो देता हूं।

संपादित करें: पिछड़े संगतता के लिए आप निम्नलिखित का उपयोग नहीं कर सकते हैं, लेकिन मेरे साथ पढ़ने वाले किसी भी व्यक्ति के लिए एक स्पष्ट प्रारूप के बिना एक संस्करण प्रस्तुत करना चाहिए

    String text = dateTime.toString();
    OffsetDateTime test = OffsetDateTime.parse(text);

उत्पादित स्ट्रिंग में दो अंतर हैं:

  1. यह 3 दशमलव के कई समूहों के रूप में पैदा करता है, जो परिशुद्धता को प्रस्तुत करने के लिए आवश्यक हैं। आमतौर पर मेरे जावा 8 पर 3 दशमलव और मेरे जावा 9 पर 6 दशमलव, लेकिन कभी-कभी यह मिलीसेकंड के एक दौर की संख्या को हिट करता है और कम दशमलव पैदा करता है। यह 9 डेसीमल के माध्यम से 0 से सब कुछ के साथ एक स्ट्रिंग को पार्स करता है, इसलिए यह पार्सिंग में कोई समस्या पेश नहीं करता है। और मैं हमेशा ओरिजिनल OffsetDateTime ऑब्जेक्ट के पूर्ण OffsetDateTime को संरक्षित करता OffsetDateTime
  2. UTC से ऑफ़सेट एक बृहदान्त्र के साथ प्रदान किया जाता है, उदाहरण के लिए +01:00

आपके कोड में क्या गलत हुआ?

SimpleDateFormat वर्ग लंबे समय तक पुराना और कुख्यात परेशान करने वाला है, इसलिए भले ही आपको वर्तमान में इसके साथ कोई समस्या नहीं थी, फिर भी मैं आपको इसे छोड़ने और java.time , आधुनिक जावा दिनांक और समय एपीआई का उपयोग करने की java.time , जैसे कि, मैं। ऊपर करो।

पुराने SimpleDateFormat और आधुनिक DateTimeFormatter बीच एक अंतर यह है कि जबकि S को आधुनिक फॉर्मेट में दूसरे के अंश का मतलब है, SimpleDateFormat इसका अर्थ है मिलीसेकंड, इसलिए तीन के अलावा कोई अन्य संख्या अर्थहीन है। हालाँकि, यह अन्य संख्याओं को स्वीकार करता है। स्वरूपण करते समय, आपके फॉर्मेट ने मिलीसेकंड के लिए पर्याप्त अंक का उत्पादन किया, उदाहरण के लिए 89 अगर 21.089 सेकंड या 214 जब आपके पास प्रश्न के रूप में 13.214 था। पूर्व गलत है, 21.089 सेकंड 21.89 रूप में प्रस्तुत किए गए थे। मेरा दृढ़ता से मानना ​​है कि तीन-अंकीय मिलीसेकंड के कारण आपका पार्सिंग विफल हो गया जब आपके पास केवल एक S । मेरे जावा 8 और 9 पर यह काम करता है और 21.89 सेकंड के रूप में 21 सेकंड 89 मिलीसेकंड भी 21.89 करता है ताकि त्रुटि सामने आए।

यह व्यवहार जावा 9 प्रलेखन के साथ सहमत है, जो बताता है: "स्वरूपण के लिए, पैटर्न अक्षरों की संख्या अंकों की न्यूनतम संख्या है, और छोटी संख्या इस राशि के लिए शून्य-गद्देदार हैं। पार्सिंग के लिए, पैटर्न अक्षरों की संख्या को अनदेखा किया जाता है, जब तक कि इसे दो आसन्न क्षेत्रों को अलग करने की आवश्यकता न हो। ”

संपर्क

    Date date = new Date();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ");//2018-02-05T18:00:51.001+0000
    String text = dateFormat.format(date);

    Date test = dateFormat.parse(text);

पहली तीन लाइनें ठीक काम करती हैं। जब मैं स्ट्रिंग को एक तारीख में पार्स करने की कोशिश करता हूं तो मुझे एक त्रुटि मिलती है। इसे कैसे हल किया जा सकता है?

त्रुटि इस तरह दिखती है:

Caused by: java.text.ParseException: Unparseable date: "2018-02-07T15:32:13.214+0100"
    at java.text.DateFormat.parse(DateFormat.java:366) ~[na:1.8.0_151]
    at TimeRange.parseDateFromIsoString(TimeRange.java:33) ~[classes/:na]

मैंने सरल तिथि प्रारूप में Z को हटा दिया है जो समय क्षेत्र से संबंधित है जो सही नीचे पुट देता है स्निपेट है।

Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");//2018-02-05T18:00:51.001+0000
String text = dateFormat.format(date);

try {
    Date test = dateFormat.parse(text);
} catch (ParseException e) {
    e.printStackTrace();
}





unparseable