2017-09-15 20 views
13

मैंने जावा 8 (1.8.0_77) और जावा 9 (जावा हॉटस्पॉट (टीएम) 64-बिट सर्वर वीएम (9 + 181, मिश्रित मोड का निर्माण) में कुछ कोड की कोशिश की है।)जर्मन लोकेल में जेडीके डेटफॉर्मेटर पार्सिंग डेऑफविक, जावा 8 बनाम जावा 9

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN); 
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from); 
System.out.println("mo = " + mo); 

मैं उन वर्गों के विवरण के साथ भी परिचित नहीं हूँ, लेकिन जावा 8 में यह काम करता है, मुद्रण:

मो = सोमवार

जावा 9 में, हालांकि यह विफल

धागा "मुख्य" java.time.format.DateTimeParseException में अपवाद: पाठ 'मो' java.base में सूचकांक 0 में पार्स नहीं किया जा सकता है/java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter.java : 1988) java.base/java.time.format.DateTimeFormatter.parse (DateTimeFormatter.java:1890 पर ) day.main पर (day.java:10)

कोई भी विचार, इस प्रतिलिपि प्रस्तुत करने योग्य है?

तो

, जब formating: इस कोड का उपयोग:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("eee", Locale.GERMAN); 
String format = dtf.format(DayOfWeek.MONDAY); 
System.out.println("format = " + format); 

jdk1.8.0-77:

प्रारूप = मो

JDK -9 (निर्माण 9 + 181)

फॉर्म टी = मो

+2

https://ideone.com/6t60j1 क्या आप जावा -8 के बारे में निश्चित हैं? –

+0

अच्छी तरह से मैंने 1.8.0_77 का उपयोग किया। क्या इस साइट पर इस संस्करण का उपयोग करना संभव है? – user140547

+0

विचार कुछ संस्करण प्रदान कर रहा है जिस पर आपका कोई नियंत्रण नहीं है। (और सेवा पहले से ही वास्तव में अच्छा आईएमएचओ है) –

उत्तर

10

यह JEP - 252 के कार्यान्वयन जिसमें कहा गया है साथ CLDR date-time-patterns का वर्तमान क्रियान्वयन की वजह से वहाँ में हो रहा है कि

यूनिकोड कंसोर्टियम के आम लोकेल डाटा भंडार से उपयोग स्थल के डेटा (सीएलडीआर) डिफ़ॉल्ट रूप से।

स्वरूपण और प्रदर्शन के अनुवाद के लिए स्थानीय पैटर्न स्ट्रिंग्स, जैसे लोकेल नाम, कुछ स्थानीय लोगों में भिन्न हो सकते हैं।

व्यवहार JDK 8 के साथ संगत को सक्षम करने के सिस्टम Compat CLDR से आगे के साथ एक मूल्य के संपत्ति java.locale.providers निर्धारित किया है।


और यह के दूसरे डेटा हिस्सा है, international components for Unicode in German locale जो निम्नलिखित प्रासंगिक जानकारी का औचित्य साबित कर सकते हैं कि व्यवहार जानबूझकर है है करने के लिए -

enter image description here

संपादित करें/नोट: जैसा कि @ManiGrover द्वारा लिंक किया गया है, migration guide ऐसे इम्प्लेमेन के लिए एक समान चेतावनी बताता है tations -

आपके आवेदन को सफलतापूर्वक शुरू होता है, तो अपने परीक्षण पर ध्यान से देखो और सुनिश्चित करें कि व्यवहार JDK 8 पर रूप में ही है उदाहरण के लिए, एक कुछ आरंभिक अनुकूलक देखा है कि उनके तिथियाँ और मुद्राओं हैं अलग प्रारूपित। Use CLDR Locale Data by Default.

+2

https://docs.oracle.com/javase/9/migrate/toc.htm#JSMIG-GUID-AFD3BDEC-99FC-4F3C-946F-A1CD2D05B74B "अगर आपका आवेदन सफलतापूर्वक शुरू होता है, अपने परीक्षणों पर ध्यान से देखें और यह सुनिश्चित करें कि व्यवहार जेडीके 8 जैसा ही है। उदाहरण के लिए, कुछ प्रारंभिक गोद लेने वालों ने देखा है कि उनकी तिथियां और मुद्राएं अलग-अलग स्वरूपित हैं। डिफ़ॉल्ट रूप से सीएलडीआर लोकेल डेटा का उपयोग करें। " –

6

abbreviatiions "मो" देखो, "डि" आदि डॉट बिना CLDR में गायब नहीं है, लेकिन स्टैंडअलोन मोड के माध्यम से सुलभ हैं। इसके बजाय आप "ई" का स्टैंडअलोन प्रारूप प्रतीक "सी" का उपयोग कर अपने पैटर्न बदलना चाहिए:

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("ccc", Locale.GERMAN); 
DayOfWeek mo = dtf.parse("Mo", DayOfWeek::from); 

दरअसल, मैं (व्यवहार को तोड़ने के रूप में ठोस) पश्च संगतता को तोड़ने के रूप में अंतर्निहित डेटा के परिवर्तन पर विचार करें।

+5

डिफ़ॉल्ट रूप से सीडीएलआर लोकेल डेटा का उपयोग करने के लिए संक्रमण वास्तव में एक विघटनकारी परिवर्तन है। जेडीके 8 में सीडीएलआर लोकेल डेटा शामिल है ताकि आप जेडीके 9 पर जाने से पहले किसी भी मुद्दे की पहचान करने के लिए '-Djava.locale.providers = CLDR' के साथ चल सकें। –

संबंधित मुद्दे