2014-10-02 9 views
6

के साथ सही ढंग से काम नहीं करते हैं, मेरी कुछ विधि का परीक्षण करते समय मैंने एक अजीब समस्या में भाग लिया है और मुझे लगता है कि मेरी समस्या का एक ठोस उदाहरण प्राप्त करने में सक्षम है।लोकलडेट और डेटटाइमफॉर्मेटर जापानी लोकेल

मैं ja_JP_JP_#u-ca-japanese लोकेल का उपयोग कर रहा हूं जो लोकेल द्वारा परिभाषित अपने स्वयं के दिनांक पैटर्न का उपयोग करके किसी तारीख को पार्स करने में सक्षम नहीं है।

मुझे आश्चर्य है कि मैं कुछ गलत कर रहा हूं, या यदि यह एक जेडीके बग है।

कृपया ध्यान दें कि क्रम में ja_JP_JP_#u-ca-japanese निर्माण करने के लिए, आप the Locale javadoc से प्रति अंश के रूप में new Locale("ja", "JP", "JP") उपयोग करने की आवश्यकता:

विशेष मामलों

संगतता कारणों के लिए, दो गैर-अनुरूप स्थानों विशेष मामलों के रूप में इलाज कर रहे हैं । ये ja_JP_JP और th_TH_TH हैं। ये बीसीपी 47 में खराब हैं क्योंकि वेरिएंट बहुत कम हैं। बीसीपी 47 में माइग्रेशन को कम करने के लिए, इन्हें विशेष रूप से निर्माण के दौरान माना जाता है। इन दो मामलों (और केवल इन्हें) एक एक्सटेंशन उत्पन्न करने के लिए एक कन्स्ट्रक्टर का कारण बनता है, अन्य सभी मान ठीक उसी तरह व्यवहार करते हैं जैसे उन्होंने जावा 7 से पहले किया था।

जावा ने जापानी इंपीरियल कैलेंडर के साथ जापान में उपयोग किए जाने वाले जापानी का प्रतिनिधित्व करने के लिए ja_JP_JP का उपयोग किया है । यह यूनिकोड लोकेल कुंजी सीए ("कैलेंडर" के लिए) निर्दिष्ट करके और जापानी टाइप करके यूनिकोड लोकेल एक्सटेंशन का उपयोग करके अब प्रतिनिधित्व योग्य है। जब लोकेल कन्स्ट्रक्टर को तर्क "जेए", "जेपी", "जेपी" के साथ बुलाया जाता है, तो एक्सटेंशन "यू-सीए-जापानी" स्वचालित रूप से जोड़ा जाता है।

जावा ने थाई अंकों के साथ थाईलैंड में उपयोग किए जाने वाले थाई का प्रतिनिधित्व करने के लिए th_TH_TH का उपयोग किया है। यह यूनिकोड लोकेल कुंजी एनयू ("संख्या" के लिए) और मूल्य थाई निर्दिष्ट करके यूनिकोड लोकेल एक्सटेंशन का उपयोग करके अब भी प्रतिनिधित्व योग्य है। जब लोकेल कन्स्ट्रक्टर को तर्क "वें", "TH", "TH" के साथ बुलाया जाता है, तो एक्सटेंशन "u-nu-thai" स्वचालित रूप से जोड़ा जाता है।

दिया परीक्षण का मामला है कि समस्या को दर्शाता है:

@Test 
public void testJapaneseLocale() { 
    LocalDate specificLocalDate = LocalDate.of(2014, 10, 2); 
    Locale jpLocale = new Locale("ja", "JP", "JP"); 

    DateTimeFormatter jpDateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(jpLocale); 
    String jpDate = specificLocalDate.format(jpDateTimeFormatter); 

    String jpPattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.SHORT, null, Chronology.ofLocale(jpLocale), jpLocale); 
    LocalDate jpLocalDate = LocalDate.parse(jpDate, DateTimeFormatter.ofPattern(jpPattern, jpLocale)); 

    assertEquals(specificLocalDate, jpLocalDate); 
} 

इस कोड को इस तरह अंग्रेज़ी के रूप में किसी भी अन्य सामान्य स्थान, आदि के लिए काम करता है

उत्तर

4

दौर ट्रिपिंग की क्षमता करता है काम, लेकिन इसे उपलब्ध कराए जाने वाले सभी डेटा की आवश्यकता है।

LocalDate date = LocalDate.of(2014, 10, 2); 
Locale jpLocale = new Locale("ja", "JP", "JP"); 
Chronology chrono = Chronology.ofLocale(jpLocale); 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) 
     .withLocale(jpLocale) 
     .withChronology(chrono); 
String jpDateStr = date.format(f); 
LocalDate result = LocalDate.parse(jpDateStr, f); 

ही दूसरे मामले में, जहां ofPattern() का उपयोग कर का सच है लोकेल ताले:

पहले मामले में, आप withLocale() और withChronology() तरीकों का उपयोग कर दोनों स्थान और कालक्रम निर्दिष्ट करने की आवश्यकता नहीं, बल्कि कालक्रम:

String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(
    FormatStyle.SHORT, null, chrono, jpLocale); 
DateTimeFormatter f = DateTimeFormatter.ofPattern(pattern, jpLocale) 
    .withChronology(chrono); 
LocalDate jpLocalDate = LocalDate.parse(jpDateStr, f); 

केवल जब दोनों स्थान और कालक्रम उपलब्ध हैं और इस्तेमाल किया दौर ट्रिपिंग जाएगा संभव हो सकता है। आपकी समस्या जापानी लोकेल का उपयोग करके प्रारूपित करने की कोशिश कर रही है, लेकिन जापानी क्रोनोलॉजी को असंगत रूप से लागू करना है।

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