मैं अपने आवेदन में JSR 310 दिनांक समय एपीआई * उपयोग कर रहा हूँ, और मैं पार्स करने के लिए और प्रारूप सैन्य तारीख बार (DTG या "दिनांक समय समूह" के रूप में जाना जाता है) की जरूरत है क्षेत्रों।सैन्य समय JSR 310 (DATETIME एपीआई) का उपयोग कर
प्रारूप मैं इस तरह दिखता है (DateTimeFormatter
उपयोग करते हुए) को पार्स कर रहा हूँ:
"ddHHmm'Z' MMM yy" // (ie. "312359Z DEC 14", for new years eve 2014)
यह स्वरूप जैसा कि ऊपर वर्णित पार्स करने के लिए काफी आसान है। समस्या तब उत्पन्न होती है जब तिथियों में 'Z' (ज़ुलू समय क्षेत्र, यूटीसी/जीएमटी के समान) की तुलना में एक अलग समय क्षेत्र होता है, उदाहरण के लिए 'ए' (अल्फा, यूटीसी + 1: 00) या 'बी' (ब्रावो, यूटीसी + 2:00)। पूरी सूची के लिए Military time zones देखें।
मैं इन समय क्षेत्रों कैसे पार्स कर सकते हैं? या दूसरे शब्दों में, मैं शाब्दिक 'ज़ेड' के अलावा उपरोक्त प्रारूप में क्या डाल सकता हूं ताकि यह सभी क्षेत्रों को सही ढंग से पार्स कर सके? मैं "ddHHmmX MMM yy"
, "ddHHmmZ MMM yy"
और "ddHHmmVV MMM yy"
उपयोग करने की कोशिश की है, लेकिन उनमें से कोई भी काम करते हैं (सब से ऊपर जब पार्स करने उदाहरण के लिए DateTimeParseException: Text '312359A DEC 14' could not be parsed at index 6
फेंक देंगे,)। (जब DateTimeFormatter
का दृष्टांत करने की कोशिश कर IllegalArgumentException
) एक एकल V
प्रारूप में अनुमति नहीं है का उपयोग करना।
संपादित करें: ऐसा लगता है कि प्रतीक z
, काम कर सकते थे अगर यह नीचे जारी करने के लिए नहीं था।
मैं भी कि मैं सभी नामित क्षेत्रों के साथ एक ZoneRulesProvider
बनाया है और ऑफसेट सही उल्लेख करना चाहिए। मैंने सत्यापित किया है कि ये एसपीआई तंत्र का उपयोग करके सही तरीके से पंजीकृत हैं, और मेरी provideZoneIds()
विधि अपेक्षित के रूप में लागू की जाती है। अभी भी पार्स नहीं होगा। एक साइड इश्यू के रूप में (संपादित करें: यह अब मुख्य मुद्दा प्रतीत होता है), एपीआई द्वारा 'जेड' के अलावा एकल वर्ण समय क्षेत्र आईडी (या "क्षेत्र") की अनुमति नहीं है।
उदाहरण के लिए:
ZoneId alpha = ZoneId.of("A"); // boom
DateTimeException: Invalid zone: A
(यहां तक कि मेरे नियमों प्रदाता तक पहुँचने यदि वह मौजूद है को देखने के लिए बिना) फेंक देते हैं।
क्या यह एपीआई में एक निरीक्षण है? या मुझ से कुछ गलत हो रहा है?
*) वास्तव में, मैं जावा 7 और ThreeTen Backport उपयोग कर रहा हूँ, लेकिन मुझे नहीं लगता कि इस प्रश्न के लिए मायने रखती है है। (। यानी "ddHHmm'A' MMM yy"
, "ddHHmm'B' MMM yy"
, आदि), क्षेत्र आईडी निकालने, और सही क्षेत्र पर आधारित फ़ॉर्मेटर को सौंपने के लिए एक RegExp
का उपयोग मेरे वर्तमान समाधान का शाब्दिक क्षेत्र आईडी के साथ 25 विभिन्न DateTimeFormatter
रों उपयोग करने के लिए है:
पी एस। प्रदाता में जोन आईडी को ज़ोन खोजने के लिए ZoneId.of(...)
की अनुमति देने के लिए "अल्फा", "ब्रावो" नाम दिया गया है। यह काम करता हैं। लेकिन यह बहुत ही सुरुचिपूर्ण नहीं है, और मुझे आशा है कि एक बेहतर समाधान होगा।
क्या आपने प्रारूप स्ट्रिंग में क्षेत्र-आईडी के लिए 'V'' की कोशिश की है (यानी "ddHHmmV MMM yy" ')? AFAIK 'Z' का अर्थ केवल 'Z' वर्ण है। https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html –
हां, मैं समझता हूं कि 'ज़ेड' एक शाब्दिक है और इसका विश्लेषण पार्सर द्वारा नहीं किया जाता है। 'Z' (unquoted) हालांकि एक प्रतीक है (लेकिन काम नहीं करता है)। और हाँ, मैंने 'वी' की कोशिश की। यह यद्यपि एक अलग त्रुटि देता है ... 'अवैध अर्ग्यूमेंट अपवाद: फ़ॉर्मर बनाने की कोशिश करते समय पैटर्न अक्षर गणना 2: V' होना चाहिए। 'वीवी' का उपयोग करके, मैं वापस पा रहा हूं "... को पार्सिंग के दौरान" इंडेक्स 6 पर पार्स नहीं किया जा सका "। फिर भी धन्यवाद! :-) – haraldK
@PavelHoral वास्तव में, ऐसा लगता है कि "सही" प्रतीक 'z' (लोअरकेस) है ... ऐसा लगता है कि ज़ोन को सही ढंग से पार्स करना है, लेकिन निश्चित रूप से यह एक अक्षर अक्षर की अनुमति नहीं है ..: -पी "' ... पार्स नहीं किया जा सका: अवैध क्षेत्र: ए' "। मैं प्रश्न अपडेट करूँगा ... – haraldK