Java8 में Timezone के साथ लोकल डेटाइम को फॉर्मेट करें


121

मेरे पास यह सरल कोड है:

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
LocalDateTime.now().format(FORMATTER)

फिर मुझे निम्नलिखित अपवाद मिलेगा:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: OffsetSeconds
at java.time.LocalDate.get0(LocalDate.java:680)
at java.time.LocalDate.getLong(LocalDate.java:659)
at java.time.LocalDateTime.getLong(LocalDateTime.java:720)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
at java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser.format(DateTimeFormatterBuilder.java:3315)
at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2182)
at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1745)
at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1719)
at java.time.LocalDateTime.format(LocalDateTime.java:1746)

इस समस्या को कैसे हल करें?

जवाबों:


212

LocalDateTimeएक समय-क्षेत्र के बिना एक तिथि-समय है। आपने प्रारूप में समय क्षेत्र ऑफसेट प्रारूप प्रतीक को निर्दिष्ट किया है, हालांकि, LocalDateTimeऐसी जानकारी नहीं है। इसलिए त्रुटि हुई।

यदि आप समय-क्षेत्र की जानकारी चाहते हैं, तो आपको उपयोग करना चाहिए ZonedDateTime

DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
ZonedDateTime.now().format(FORMATTER);
=> "20140829 14:12:22.122000 +09"

3
सुपर सहायक। यकीन नहीं होता कि मैंने टाइमजोन के टुकड़े को इतनी आसानी से पकड़ा होगा। बहुत बढ़िया जवाब। धन्यवाद!
लारन इवांस

40

JSR-310 (जावा -8 में उर्फ ​​जावा.टाइम-पैकेज) में उपसर्ग "स्थानीय" इंगित नहीं करता है कि उस वर्ग (यहां:) की आंतरिक स्थिति में एक समय क्षेत्र की जानकारी है LocalDateTime। जैसे अक्सर भ्रामक नाम इस तरह के वर्गों के बावजूद LocalDateTimeया LocalTimeकोई समय क्षेत्र में जानकारी है या ऑफसेट

आपने ऑफसेट जानकारी (पैटर्न प्रतीक Z द्वारा इंगित) के साथ इस तरह के एक लौकिक प्रकार (जिसमें कोई ऑफसेट नहीं है) को प्रारूपित करने की कोशिश की। इसलिए फ़ॉर्मेटर अनुपलब्ध जानकारी तक पहुंचने का प्रयास करता है और आपके द्वारा देखे गए अपवाद को फेंकना पड़ता है।

उपाय:

एक प्रकार का उपयोग करें जिसमें इस तरह की ऑफसेट या टाइमज़ोन जानकारी हो। JSR-310 में यह या तो OffsetDateTime(जिसमें एक ऑफसेट होता है लेकिन DST- नियमों सहित एक टाइमज़ोन नहीं है) या ZonedDateTime। आप इस तरह के सभी समर्थित क्षेत्रों को देख सकते हैं विधि -Supported (TemporalField) पर लुक-अप करके । क्षेत्र OffsetSecondsमें समर्थित है OffsetDateTimeऔर ZonedDateTimeनहीं, बल्कि में LocalDateTime

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss.SSSSSS Z");
String s = ZonedDateTime.now().format(formatter);

भ्रम से बचने के लिए आपने "स्थानीय" उपसर्ग को किस उपसर्ग से बदल दिया होगा?
मैथ्यू

@ मैथ्यू में बैंक क्रेडिट सुइस द्वारा नाम आदि को लेकर शुरू की गई एक बहस भी थी PlainDateTime। संभवतः बेहतर है क्योंकि उपसर्ग "सादे" से संकेत मिलता है कि सिर्फ तारीख-समय से अधिक कुछ नहीं है। यदि हम अभी भी Java v1.0 से पहले थे, तो कोई भी उपसर्ग बेहतर नहीं होगा, लेकिन Dateआदि जैसे नाम पहले से पुराने JDK द्वारा आरक्षित हैं।
Meno Hochschild

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