2016-06-20 9 views
6

के साथ अवैध पैटर्न वर्ण त्रुटि मैं कुछ SimpleDateFormat कोड को समझने की कोशिश कर रहा हूं। विशेष रूप से मैं SimpleDateFormat में स्थानीय पैटर्न स्ट्रिंग का उपयोग करने की कोशिश कर रहा हूं। javadoc से:SimpleDateFormat स्थानीय पैटर्न पैटर्न

SimpleDateFormat स्थानीयकृत दिनांक और समय पैटर्न स्ट्रिंग का भी समर्थन करता है। इन तारों में, ऊपर वर्णित पैटर्न अक्षरों को अन्य, लोकेल आश्रित, पैटर्न अक्षरों के साथ प्रतिस्थापित किया जा सकता है।

यह भी एक SimpleDateFormat(String pattern, DateFormatSymbols formatSymbols) निर्माता निर्दिष्ट करता है:

Constructs एक SimpleDateFormat दिए गए पैटर्न और दिनांक स्वरूप प्रतीकों का उपयोग।

public void run() { 
    Locale loc = new Locale("de", "de"); 
    DateFormatSymbols dfs = new DateFormatSymbols(loc); 
    String sym = dfs.getLocalPatternChars(); 
    System.out.println(sym); 
    SimpleDateFormat datefmt = new SimpleDateFormat("tt.MM.uuuu", dfs); 
} 

का उत्पादन उत्पादन:

GuMtkHmsSEDFwWahKzZ 
Exception in thread "main" java.lang.IllegalArgumentException: Illegal pattern character 't' 
    at java.text.SimpleDateFormat.compile(SimpleDateFormat.java:845) 
    ... 

मैं एक ही उत्पादन करता है, तो मिल

हालांकि, हालांकि getLocalPatternChars() उदाहरण की उम्मीद पैटर्न वर्ण प्रस्तुत कर रहा है, SimpleDateFormat के कन्स्ट्रक्टर्स युक्त पैटर्न उन अक्षरों को अस्वीकार कर रहे हैं मैं "... new SimpleDateFormat("tt.MM.uuuu", loc);" के साथ अंतिम पंक्ति को प्रतिस्थापित करता हूं।

दूसरी ओर, यदि मैं किसी भी Anglicized पैटर्न स्ट्रिंग का उपयोग कर एक SimpleDateFormat उदाहरण बनाते हैं, तो "applyLocalizedPattern("tt.MM.uuuu")" पर कॉल करें, स्थानीय पैटर्न स्वीकार किया जाता है।

तो ऐसा लगता है कि कोई SimpleDateFormat के रचनाकारों में स्थानीय पैटर्न स्ट्रिंग का उपयोग नहीं कर सकता है, और इन दो-चरणीय प्रारंभिकरण की आवश्यकता है। क्या यह जानबूझकर व्यवहार है?

+2

कन्स्ट्रक्टर 'translatePattern'' नहीं कहता है ('लागू लोकाइज्ड पैटर्न 'वह करता है), तो यह या तो एक बग या खराब जावाडॉक है जो कन्स्ट्रक्टर के उपयोग को स्पष्ट रूप से समझाता नहीं है। – Tom

+0

@ टॉम सही है। कन्स्ट्रक्टर का पैटर्न पैरामीटर केवल अनौपचारिक दिनांक-समय-पैटर्न-वर्णों को संदर्भित करता है। –

+0

यह भी देखें http://stackoverflow.com/a/24128930/2491410 –

उत्तर

3

दुर्भाग्यवश स्थानीयकृत पैटर्न को कैसे संभालना है इसका दस्तावेज भयानक है। तो मैंने स्रोत कोड का अध्ययन किया और अपनी खुद की जांच की। परिणाम:

SimpleDateFormat का कन्स्ट्रक्टर पैटर्न स्ट्रिंग को स्वीकार करने से केवल अनौपचारिक पैटर्न वर्णों को संदर्भित किया जाता है जिनकी परिभाषा कक्षा SimpleDateFormat के जावाडोक हेडर में दी गई है। लेकिन नहीं है - (जैसे "tt.MM.uuuu" क्या आप जर्मन प्रतीत होने वाली

/** 
* Unlocalized date-time pattern characters. For example: 'y', 'd', etc. 
* All locales use the same these unlocalized pattern characters. 
*/ 
static final String patternChars = "GyMdkHmsSEDFwWahKzZYuXL"; 

तीन कदम आदेश स्थानीय पैटर्न का उपयोग करने के लिए आवश्यक हैं: ये unlocalized पैटर्न पात्रों भी DateTimeFormatSymbols में लगातार के रूप में परिभाषित कर रहे हैं जर्मन, यह नहीं बल्कि "TT.MM.JJJJ" होना चाहिए - गलत JDK संसाधनों के लिए उदाहरण):

  1. DateFormatSymbols.setLocalPatternChars(...) के माध्यम से स्थानीय पैटर्न पात्रों को परिभाषित करें।
  2. अपने SimpleDateFormat -object पर अनुकूलित दिनांक-प्रारूप-प्रतीकों का उपयोग करें।
  3. के माध्यम से SimpleDateFormat.applyLocalizedPattern(...)

तब स्थानीय पैटर्न आंतरिक और सरकारी पैटर्न चरित्र परिभाषा करने के लिए अनुवाद किया जाएगा स्थानीय तिथि-समय-पैटर्न को लागू करें।

उपयोग का उदाहरण (सही जर्मन पैटर्न टीटी.एमएम का उपयोग करना।Jjjj):

SimpleDateFormat sdf = new SimpleDateFormat(); // uses default locale (here for Germany) 
System.out.println(sdf.toPattern()); // dd.MM.yy HH:mm 
System.out.println(sdf.toLocalizedPattern()); // tt.MM.uu HH:mm 

DateFormatSymbols dfs = DateFormatSymbols.getInstance(Locale.GERMANY); 
dfs.setLocalPatternChars("GJMTkHmsSEDFwWahKzZYuXL"); 
sdf.setDateFormatSymbols(dfs); 
sdf.applyLocalizedPattern("TT.MM.JJJJ"); 

System.out.println(sdf.toPattern()); // dd.MM.yyyy 
System.out.println(sdf.toLocalizedPattern()); // TT.MM.JJJJ 
System.out.println(sdf.format(new Date())); // 20.06.2016 

साइड नोट: मैं बदल गया है उचित पैटर्न y और जम्मू और टी स्ट्रिंग "GyMdkHmsSEDFwWahKzZYuXL" में करने के लिए घ वर्ण एक स्थानीय परिभाषा बनाने के लिए।

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

+0

मैंने इन स्थानीयकृत दिनांक-समय-पैटर्न-वर्णों जैसे "GyMdkHmsSEDFwWahKzZYuXL" के लिए सीएलडीआर डेटा के भीतर भी खोज की है लेकिन अभी तक नहीं मिली है। तो यह मेरे लिए स्पष्ट नहीं है कि कैसे सूर्य/ओरेकल इन आंकड़ों को प्राप्त करता है। क्या यह उनका अनुमान है? शायद किसी को स्थानीय डेटा के स्रोत के बारे में और पता है? –

+0

आह ठीक है, CLDR-data के पुराने संस्करण तत्व को जानते हैं। इसे हटा दिया गया है और अब भर नहीं गया है (सीएलडीआर v29 में)। तो जेडीके पुराने डेटा का उपयोग करता प्रतीत होता है। यह भी देखें [आईसीयू-टिकट] (https://sourceforge.net/p/icu/mailman/message/10846249/) –

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