2015-09-28 6 views
6

मैं कल इस अद्भुत स्थिर विधि बनाया है, और यह ठीक काम किया - कलपार्सिंग ISO_INSTANT और इसी तरह की दिनांक समय स्ट्रिंग्स

बहरहाल, आज यह मुझे इस त्रुटि देता है। मुझे लगता है कि यह पहले जेड

किसी को भी एक संक्षिप्त तरीके से (जावा 8) String प्रारूप तारीख के इस प्रकार में पार्स करने के लिए कैसे अनुशंसा कर सकते हैं भी कई 0s से है - ध्यान में रखते हुए कि यह भी कल काम किया है, तो ISO_INSTANT भी है String के लिए एक वैध प्रारूप?

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed 
at java.time.LocalDate.from(LocalDate.java:368) 
at java.time.LocalDateTime.from(LocalDateTime.java:456) 
... 9 more 

इनपुट समय पर एक अपवाद फेंक: "2015-09-28T14: 46: 44.000000Z"

/** 
* 
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z") 
* @return 
*/ 
public static LocalDateTime parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return LocalDateTime.from(f.parse(time)); 
} 

enter image description here

+0

ISO_INSTANT समय क्षेत्र का समर्थन नहीं करता, जैसे कुछ के साथ ठीक किया जा सकता है: 'Instant.from (DateTimeFormatter.ISO_DATE_TIME.parse (" 2017-04-20T00: 00: 00 + 04: 00 "))' –

उत्तर

11

आप एक स्ट्रिंग है कि एक आईएसओ तत्काल के साथ संगत है पार्स करने कर रहे हैं ताकि आप LocalDateTime के बजाय एक Instant में परिणाम स्टोर करने के लिए की जरूरत है:

public static Instant parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); 
} 

ध्यान दें कि यह फ़ॉर्मेटर सही ढंग से fractional सेकंड संभालता है ताकि आपको उन्हें हटाने की आवश्यकता न हो। उद्धरण DateTimeFormatter.ISO_INSTANT जावाडोक (जोर मेरा):

पार्सिंग करते समय, कम से कम सेकंड फ़ील्ड की आवश्यकता होती है। शून्य से नौ तक फ्रैक्शनल सेकेंड पार्स किए गए हैं।

के कारण है कि यह कल और न आज काम के रूप में, मुझे पता नहीं है ...

बस बाद में इस प्रश्न को देखे किसी को मदद करने के लिए
+0

धन्यवाद, और यह ठीक है 'LocalDateTime.from (तत्काल); '? मेरा कोड वास्तव में LocalDateTime प्रारूप की अपेक्षा कर रहा है। नैनोसेकंद महत्वपूर्ण नहीं हैं – ycomp

+2

@ycomp आप एक त्वरित से स्थानीयडेटाइम में कनवर्ट कर सकते हैं, [यह उत्तर] देखें (http://stackoverflow.com/a/19726814/1743880)। – Tunaki

+0

शायद मैंने कल इसे कोड किया था, सोचा था कि मैंने इसे चलाया लेकिन आज तक इसे कभी नहीं चला - मैं अपने कोड में कुछ भी नहीं देख सकता जो इंगित करता है कि मैं कल इसे चलाने में सक्षम होता .. इसलिए मुझे लगता है कि यह वास्तव में कभी काम नहीं करता मैंने मूल रूप से इसे कोड किया – ycomp

3

आप Instant के रूप में आईएसओ दिनांक पार्स यह Instant वस्तु में बदलने और उसके बाद क्षेत्र क्रमांक प्रदान इसमें से एक LocalDateTime बनाना होगा। मैं यहां यूटीसी के जोन आईडी को स्थापित कर रहा हूं।

कोड के रूप में इस प्रकार है

public static LocalDateTime getISODate(String dateString) { 
    DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; 
    Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); 
    LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); 

    return date; 
} 
संबंधित मुद्दे