लोकलडाइमटाइम (Java 8) पार्स करते समय TemporalAccessor से LocalDateTime प्राप्त करने में असमर्थ


150

मैं केवल जावा में दिनांक स्ट्रिंग ऑब्जेक्ट में दिनांक स्ट्रिंग परिवर्तित करने का प्रयास कर रहा हूं। 8. निम्नलिखित पंक्तियों को चलाने पर:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

मुझे निम्नलिखित त्रुटि मिलती है:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

वाक्यविन्यास यहां सुझाए गए के समान है , फिर भी मुझे एक अपवाद के साथ परोसा जाता है। मैं उपयोग कर रहा हूं JDK-8u25

जवाबों:


177

यह पता चलता है कि जावा डेटाइम के रूप में एक नंगे दिनांक मान को स्वीकार नहीं करता है। LocalDateTime के बजाय LocalDate का उपयोग करना समस्या का हल करता है:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

42
यह किस लिए लायक है: उपयोग करते समय भी मुझे यही समस्या थी LocalDateऔर नहीं LocalDateTime। मुद्दा यह था कि मैं अपने बनाया था DateTimeFormatterका उपयोग कर .withResolverStyle(ResolverStyle.STRICT);, तो मैं तारीख पैटर्न का इस्तेमाल किया था uuuuMMddके बजाय yyyyMMdd(बजाय "साल के युग" की यानी "वर्ष")!
ज़ीरोने

71

यदि आपको वास्तव में किसी लोकलडेट टाइम ऑब्जेक्ट को बदलने की आवश्यकता है, तो आप लोकलडेट का उपयोग कर सकते हैं। StStartOfDay ()। यह आपको निर्दिष्ट तिथि पर एक LocalDateTime ऑब्जेक्ट देगा, जिसमें घंटे, मिनट और दूसरा फ़ील्ड 0 पर सेट होगा:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

2
सुधार: उस दिन की शुरुआत में जो भी समय होगा उस पर सेट करें ।
तर्जका

20
LocalDateTime.fromअनावश्यक लगता है, जैसा कि atStartOfDay()पहले से ही है LocalDateTime
दारिउज़

1
स्केला: वैल समय = LocalDate.parse ( "20,171,220", DateTimeFormatter.ofPattern ( "YYYYMMDD")) atStartOfDay.format (DateTimeFormatter.ofPattern ( "yyyy-MM-yyyy HH: mm: ss"))।
वुडी सूर्य

48

अगर किसी को इस विषय को फिर से पढ़ना चाहिए तो मेरे लिए क्या मूल्य है (जैसे मेरे लिए) सही उत्तर DateTimeFormatterपरिभाषा में होगा , जैसे:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

यदि वे दिखाई देंगे तो एक को वैकल्पिक फ़ील्ड सेट करना चाहिए। और बाकी कोड बिल्कुल समान होना चाहिए।


1
यह इस तरह की विधि के लिए उदाहरण के लिए सही सार्वभौमिक समाधान है: लंबे getFileTimestamp (स्ट्रिंग फ़ाइल, पैटर्न पैटर्न, DateTimeFormatter dtf, int समूह); यहां आपके पास अलग-अलग पैटर्न और DateTimeFormetter, w / और w / o समय निर्दिष्ट है।
toootooo

क्या यह एक स्थिर क्षेत्र हो सकता है? मैंने जावदोक में नहीं पाया है कि इस तरह से बनाया गया एक उदाहरण थ्रेड-सेफ है
कामिल रोमन

parseDefaultingआपके द्वारा बुलाए गए AFTER को जोड़ना याद रखें appendPattern। नहीं तो दे दूंगा DateTimeParseException
विटीमेटेमा

31

यह वास्तव में अस्पष्ट और अनपेक्षित त्रुटि संदेश है। बहुत परीक्षण और त्रुटि के बाद मैंने पाया कि LocalDateTimeयदि आप एक बार पार्स करने का प्रयास नहीं करते हैं तो उपरोक्त त्रुटि देगा। इसके LocalDateबजाय का उपयोग करके , यह बिना किसी त्रुटि के काम करता है।

यह खराब रूप से प्रलेखित है और संबंधित अपवाद बहुत ही अनपेक्षित है।


25

रिट्रोग्राफी के जवाब पर विस्तार करते हुए ..: मुझे यह समस्या तब भी थी जब उपयोग करते हुए भी LocalDateऔर नहीं भी LocalDateTime। मुद्दा यह था कि मैं अपने बनाया था DateTimeFormatterका उपयोग कर .withResolverStyle(ResolverStyle.STRICT);, तो मैं तारीख पैटर्न का इस्तेमाल किया था uuuuMMddके बजाय yyyyMMdd(बजाय "साल के युग" की यानी "वर्ष")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(यह समाधान मूल रूप से रेट्रोग्राफी के उत्तर के लिए एक टिप्पणी थी, लेकिन मुझे इसे एक अकेले-अकेले उत्तर के रूप में पोस्ट करने के लिए प्रोत्साहित किया गया क्योंकि यह स्पष्ट रूप से कई लोगों के लिए वास्तव में अच्छा काम करता है।)


1
क्यों "यू" "y" के बजाय इस कड़ी में उत्तर दिया गया है का जवाब uuuu बनाम yyyy-इन-datetimeformatter-स्वरूपण पैटर्न-कोड-इन-जावा @Peru
प्रशांत

23

जो कोई भी इस त्रुटि के साथ यहां आया, जैसे मैंने किया:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

यह निम्नलिखित पंक्ति से आया है:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

यह पता चला है कि ऐसा इसलिए था क्योंकि मैं एक बारह पैटर्न के बजाय एक 0 घंटे पर 12hr घंटा पैटर्न का उपयोग कर रहा था।

राजधानी एच का उपयोग करके घंटे को 210 पैटर्न में बदलना इसे ठीक करता है:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

12

यदि तारीख स्ट्रिंग में घंटे, मिनट और आदि के लिए कोई मूल्य शामिल नहीं है, तो आप इसे सीधे रूप में परिवर्तित नहीं कर सकते हैं LocalDateTime। आप इसे केवल एक में बदल सकते हैं LocalDate, क्योंकि स्ट्रिंग केवल वर्ष, माह और तारीख के घटकों का प्रतिनिधित्व करती है , यह सही काम होगा।

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

वैसे भी आप इसे बदल सकते हैं LocalDateTime

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

यह भी सुनिश्चित करें कि प्रारूप सही है। यह फिक्स मेरे लिए तब तक काम नहीं आया जब तक कि मुझे प्रारूप सेट yyyy-mm-ddनहीं करना चाहिए कि यह कब होना चाहिए था yyyy-MM-dd
patstuart

0

इसको आजमाओ:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

आप अपने इच्छित किसी भी प्रारूप को जोड़ सकते हैं। ये मेरे लिए सही है!


0

यह ठीक काम करता है

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

उत्पादन:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.