7

मुझे एक जीयूआई में प्रदर्शित करने के लिए जावा तिथि से केवल महीने और साल की जानकारी निकालने की आवश्यकता है। इस दिनांक का उपयोग उपयोगकर्ता लोकेल का उपयोग करके किया जाना चाहिए। मैं स्थानीय तिथियां प्रारूपित के लिए 2 तरीके जानते हैं:जावा में लोकेल-विशिष्ट स्वरूपण के लिए दिनांक फ़ील्ड निकालने के लिए कैसे करें?

  1. DateFormat.getInstance(DateFormat.LONG, locale).format(date)
  2. का उपयोग करना new SimpleDateFormat("yyyy M", locale).format(date)

स्थान SIMPLIFIED_CHINESE और तारीख 2013-02-18 के लिए उपयोग करना, इस देता है:

  1. 2013 年 2 月 18日

हमें दिन के बिना LONG प्रारूप (2013 年 2 月) का उपयोग करने की आवश्यकता है। [संस्करण 2 स्पष्ट रूप से स्वीकार्य नहीं है क्योंकि वर्ष-महीने के आदेश लोकेल से प्रभावित नहीं होते हैं]। समस्या हो सकती है: लंबे प्रारूप से दिन भाग (18 日) को कैसे हटाया जाए? मैंने विधि format(Date date, StringBuffer toAppendTo, FieldPosition pos) विधि का उपयोग करने का प्रयास किया, लेकिन यह केवल अतिरिक्त भाग नहीं, संख्या भाग निकालने की अनुमति देता है।

DateFormat.getInstance(DateFormat.LONG, Locale.SIMPLIFIED_CHINESE) का पैटर्न yyyy'年'M'月'd'日' है। दिन के हिस्से को निकालने से yyyy'年'M'月' मिलेगा। मुझे ऐसा लगता है कि अतिरिक्त पात्रों (, और ) के बाद जावा के डेटफॉर्मैट मानक का उपयोग करना संभव नहीं है) इसी क्षेत्र में मैप किए गए प्रतीत नहीं होते हैं, लेकिन फ़ॉर्मेटर के लिए अन्य अर्थात् बिना वर्ण हैं।

मुझे DateFormatSymbols और LocaleServiceProvider पर एक नज़र थी, लेकिन लगता है कि इससे मदद नहीं मिलती है। मेरे लिए, एक्सटेंशन का बिंदु getInstance(int style) विधि में एक और दिनांक शैली जोड़ देगा। लेकिन यह सभी लोकेल के लिए इसे कार्यान्वित किए बिना संभव नहीं लगता है ...

क्या यह विश्लेषण सही है? इस स्वरूपण को एक साफ तरीके से कैसे प्राप्त करें?

+0

+1: मैं इसे करने का कोई तरीका नहीं देख सकता। शायद इसके बजाय जोडाटाइम लाइब्रेरी आज़माएं। –

+0

मैंने बिना किसी सफलता के निम्नलिखित प्रयास किए: 'YearMonth.fromCalendarFields (cal) .toString (DateTimeFormat.longDate() .Locale (लोकेल) के साथ)'। – Jidehem

उत्तर

1

मुझे नहीं लगता कि किसी भी पूर्व परिभाषित स्थिरांक zh-CN locale में वर्ष-दर-महीने स्वरूपण के लिए मौजूद होंगे, इसलिए आपको इसे प्रारूपित करना होगा।

new SimpleDateFormat("yyyy年M月").format(date) 

SimpleDateFormat के रूप में (मेरे द्वारा हाइलाइट किया गया) कहते हैं:

का दिनांक और समय स्वरूपों की तारीख और समय पैटर्न तार द्वारा निर्दिष्ट कर रहे हैं। दिनांक और समय पैटर्न स्ट्रिंग के भीतर, 'ए' से 'ज़ेड' और 'ए' से 'ज़ेड' तक अनगिनत अक्षरों को दिनांक या समय स्ट्रिंग के घटकों का प्रतिनिधित्व करने वाले पैटर्न अक्षरों के रूप में व्याख्या किया जाता है। व्याख्या से बचने के लिए पाठ को सिंगल कोट्स (') का उपयोग करके उद्धृत किया जा सकता है। "" "एक एकल उद्धरण का प्रतिनिधित्व करता है। अन्य सभी वर्णों का अर्थ नहीं है; वे आसानी से आउटपुट स्ट्रिंग में प्रतिलिपि बनाते हैं या पार्सिंग के दौरान इनपुट स्ट्रिंग के खिलाफ मेल खाते हैं।

तो, चीनी अक्षरों को प्रारूप स्ट्रिंग में इस तरह से सुरक्षित रखना सुरक्षित है।

चूंकि जावा यूनिकोड है, इसलिए आप यूनिकोड स्रोत चरित्र सेट के साथ संकलित होने तक अपने स्रोत में वर्णों को रेखांकित कर सकते हैं।अन्यथा आपको इस स्ट्रिंग को बाहरी रूप से पढ़ना चाहिए, उदा। कुछ यूनिकोड संपत्ति फ़ाइल या डेटाबेस से।

+0

इस प्रकार संक्षेप में, जावा ऐसे प्रारूपों को अंतर्राष्ट्रीयकृत करने का एक तरीका प्रदान नहीं करता है। इसे मैन्युअल रूप से कार्यान्वित किया जाना चाहिए। – Jidehem

+0

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

+0

एन्कोडिंग समस्याओं से बचने का एक और तरीका शैली के लिए अनुवादित मूल्य को पुनर्प्राप्त करना है लंबी और हार्डकोड पैटर्न पैटर्न रखने के लिए दिनांक पैटर्न का कौन सा हिस्सा (हमारे मामले में, पैटर्न के 4 अंतिम वर्णों को छोड़ दें)। यह देता है: > अंतिम स्ट्रिंग पैटर्नफुल = ((SimpleDateFormat) DateFormat.getDateInstance (DateFormat.LONG, Locale.SIMPLIFIED_CHINESE))। ToPattern(); अंतिम स्ट्रिंग पैटर्न YearMonth = patternFull.substring (0, patternFull.length() - 4); – Jidehem

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