2010-08-15 10 views
6

क्या DateFormat.get*Instance()SimpleDateFormat पर लौटाई गई ऑब्जेक्ट कास्टिंग किए बिना किसी दिए गए लोकेल के लिए डिफ़ॉल्ट पैटर्न पुनर्प्राप्त करना संभव है?क्या किसी दिए गए लोकेल के लिए डिफ़ॉल्ट पैटर्न पुनर्प्राप्त करने का कोई और तरीका है?

मैं समझता हूं कि ज्यादातर मामलों में सबकुछ ठीक होगा, लेकिन javadoc, here में एक नोट है: "यदि आप प्रारूप या पार्सिंग पर अधिक नियंत्रण चाहते हैं, (या अपने उपयोगकर्ताओं को अधिक नियंत्रण देना चाहते हैं), आप DateFormat को फैक्टरी विधियों से SimpleDateFormat पर प्राप्त करने का प्रयास कर सकते हैं। यह अधिकांश देशों के लिए काम करेगा; आपको इसे try ब्लॉक में रखना याद रखें यदि आपको असामान्य मिलता है। "

तो मुझे आश्चर्य है, अगर मुझे "असामान्य एक" का सामना करना पड़ता है तो मुझे क्या करना चाहिए?

Related theme.

कोड का नमूना:

/** 
* Returns '\n'-separated string with available patterns. 
* Optional adds appropriate language code to each pattern string. 
* 
* @param showLanguage Defines if language info is required. 
* @return String with available patterns, optional (if showLanguage is set 
* to "true") adds appropriate language code to each pattern. 
*/ 
public String getPatternsForAvailableLocales(Boolean... showLanguage) { 

    /* Array of available locales */ 
    Locale[] locales = DateFormat.getAvailableLocales(); 

    String result = ""; 

    for (Locale locale : locales) { 

     /* Add language info, if necessary */ 
     if ((showLanguage.length > 0) && (showLanguage[0])) { 
      result += locale.getLanguage() + '\t'; 
     } 

     /* Retrieving pattern */ 
     try { 
      result += ((SimpleDateFormat) 
        DateFormat.getDateTimeInstance(DateFormat.SHORT, 
          DateFormat.SHORT, locale)).toPattern(); 
     } catch (ClassCastException e) { 
      // ******************************** // 
      // What's up? Is there another way? // 
      // ******************************** // 
     } 

     result += '\n'; 

    } 
    return result; 
} 
+0

मुझे यकीन नहीं है कि अगर आप "असामान्य सामना करते हैं" तो आप कुछ भी कर सकते हैं क्योंकि यह पैटर्न-आधारित नहीं हो सकता है। विशेष रूप से क्योंकि एक डेवलपर 'java.text.spi.DateFormatProvider' के माध्यम से अपना' डेटफॉर्मैट 'प्रदान कर सकता है। आपके उत्तर के लिए –

उत्तर

1

आप निम्न जावा कोड को क्रियान्वित करते हुए किसी विशेष भाषा के लिए दिनांक स्वरूप प्रतीकों को पुनः प्राप्त कर सकते हैं:

System.out.println(DateFormatSymbols.getInstance 
     (new Locale("en_US")).getLocalPatternChars()); 
System.out.println(DateFormatSymbols.getInstance 
     (new Locale("nl_NL")).getLocalPatternChars()); 

इस विशेष मामले में, डच, दिनांक स्वरूप प्रतीकों एक ही हैं।

GyMdkHmsSEDFwWahKzZ 
GyMdkHmsSEDFwWahKzZ 

यदि विदेशी भाषा के प्रतीक अलग हैं, तो आप साधारण प्रारूप स्ट्रिंग में अंग्रेजी चरित्र के लिए विदेशी भाषा चरित्र को प्रतिस्थापित करते हैं।

DateFormatSymbols कक्षा कम से कम जावा 1.4.2 के बाद से मौजूद है।

2

पैटर्न ही जिसके कारण आप इसे कास्टिंग कर रहे हैं SimpleDateFormat लिए अद्वितीय है।

यदि आपको डेटफॉर्मैट मिलता है जो कि SimpleDateFormat नहीं है, तो आप अपवाद लॉग करना चाहते हैं, कक्षा को वास्तविक कार्यान्वयन रिकॉर्ड करना है, और उस समय आपके पास स्थिति को संभालने का निर्णय लेने के लिए पर्याप्त जानकारी होगी।

अभी के लिए, क्योंकि कोई पैटर्न नहीं है, इसलिए यह परिणाम की सूची में नहीं जोड़ता है यदि यह SimpleDateFormat नहीं है।

यदि मैं पूछ सकता हूं, तो आप स्ट्रिंग्स के संग्रह के बजाय एक समेकित स्ट्रिंग क्यों लौट रहे हैं? ऐसा लगता है कि आपके परिणामों के माध्यम से लूप करना आसान होगा।

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

+0

Thx। यद्यपि आपने ठोस प्रश्न के लिए सीधा जवाब नहीं दिया है, लेकिन आपने इस संभावित परिस्थिति को संभालने के लिए सामंजस्यपूर्ण समाधान का सुझाव दिया है (जैसा कि अभ्यास द्वारा दिखाया गया है, हालाँकि संभवतः स्थिति नहीं है, लेकिन संभव है)। तो मुझे लगता है कि आपका उत्तर समाधान के रूप में स्वीकार किया जा सकता है। कोड पर आपकी टिप्पणियों के लिए – Milkywayfarer

+0

अधिक से अधिक thx।अपने प्रश्नों के उत्तर देना: – Milkywayfarer

+0

1) हाँ, मैं मानता हूँ कि तार के संग्रह का उपयोग करके अधिक सुविधाजनक हो जाएगा, लेकिन यह स्पष्ट करने के लिए क्या बारे में सवाल था सिर्फ प्रदर्शन-परक कोड था। – Milkywayfarer