आपको शायद SimpleDateFormat के बजाय अंतर्निहित स्वरूपण टैग का उपयोग करना चाहिए। आपके प्रश्न का तात्पर्य है कि आप अंतर्राष्ट्रीय उपयोगकर्ता को दिनांक और समय दिखाना चाहते हैं, और इस मामले में आपको वास्तव में उपयोगकर्ता के स्थानीय प्रारूप का उपयोग करना चाहिए (वे अलग-अलग होते हैं, आपको पता है)।
समय क्षेत्र के मामले में, इसका अंतर्राष्ट्रीयकरण और स्थानीयकरण के साथ कुछ लेना देना नहीं है, यानी यूएसए में कई अलग-अलग समय क्षेत्र हैं। यहां दो दृष्टिकोण हैं जिनका आप यहां उपयोग कर सकते हैं:
उपयोगकर्ता प्रोफ़ाइल में समय क्षेत्र जानकारी स्टोर करें (यदि आपके पास कोई है)। यह सबसे आसान तरीका है और आपको अंतर्निहित <f:convertDateTime>
टैग का उपयोग करने की अनुमति देता है।
वेब ब्राउज़र से समय क्षेत्र जानकारी प्राप्त करें। आप इसे बेन के उदाहरण की तरह अजाक्स अनुरोध के माध्यम से प्राप्त कर सकते हैं। तकनीकी रूप से आप यहां <f:convertDateTime>
टैग का भी उपयोग कर सकते हैं।
आप यूटीसी में कुछ सामान्य, लोकेल-स्वतंत्र (या यदि आप चाहें तो परिवर्तनीय) प्रारूप में टाइमस्टैम्प भेज सकते हैं, तो इसे Globalize के साथ लोकेल के लिए जावास्क्रिप्ट की दिनांक वस्तु और प्रारूप बनाने के लिए क्लाइंट पक्ष पर पार्स करें।
कुछ उदाहरणों का पालन करेंगे लेकिन मुझे पहले कुछ समझाने दें।
Locale browserLocale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
यह आप (नहीं, बल्कि समय क्षेत्र के बाद से इस संबंधित नहीं स्थान है) वेब ब्राउज़र किसी भी स्थान दे देंगे। यह वास्तव में HTTP स्वीकृति-भाषा शीर्षलेख की सामग्री को पढ़ेगा और सर्वोत्तम संभव लोकेल चुनें। यदि यह आपके लिए काम नहीं कर रहा है, तो कृपया सुनिश्चित करें कि आपने अपने faces-config.xml
में समर्थित लोकेशन सही ढंग से सेट किए हैं। सबसे अच्छा संभव लोकेल द्वारा, मैं समझता हूं कि यह उपयोगकर्ता के सबसे पसंदीदा लोकेल (यदि यह आपके एप्लिकेशन द्वारा समर्थित है) का उपयोग करने का प्रयास करेगा, तो दूसरा सबसे अच्छा और इसी तरह। यदि लोकेल में से कोई भी समर्थित नहीं है, तो यह आपके एप्लिकेशन के डिफ़ॉल्ट लोकेल में वापस आ जाएगा (फिर, faces-config.xml
में यह सेटिंग होनी चाहिए) या सर्वर की डिफ़ॉल्ट लोकेल में यदि यह सेटिंग गुम है (या कम से कम मुझे ऐसा लगता है, तो यह बनाता है समझ)।
Locale browserLocale = FacesContext.getCurrentInstance().getExternalContext().getRequestLocale();
यह एक आप स्वीकार करें-भाषा हैडर से शीर्ष लोकेल दे देंगे। कृपया अपने वेब ब्राउजर की सेटिंग्स की जांच करें - लगभग कोई रास्ता नहीं है इसके लिए आपको सर्वर लोकेल देने के लिए, जब तक वे आपके वेब ब्राउज़र के समान नहीं होते हैं।यह आपको सर्वर के डिफ़ॉल्ट दे सकता है अगर और केवल तभी, वेब ब्राउज़र का कोई भी लोकेल JVM द्वारा समर्थित नहीं है (जो थोड़ा असंभव प्रतीत होता है)।
बीटीडब्ल्यू। FacesContext.getCurrentInstance().getExternalContext().getRequestLocales()
आपको इटरेटर देगा ताकि आप स्वीकार्य-भाषा शीर्षलेख में लोकेल की सूची के माध्यम से मैन्युअल रूप से पुन: प्रयास कर सकें। यह सिर्फ आपको बताने के लिए है, आपको शायद इसका उपयोग नहीं करना चाहिए (UIViewRoot वास्तव में पर्याप्त है)।
अब, मान लीजिए कि आपके पास उपयोगकर्ता प्रोफ़ाइल और विधि के साथ कुछ बीन है जो आपको समय क्षेत्र प्रदान करेगा। यह विधि अजाक्स कॉल से बेहतर है, इस अर्थ में कि ऐसा हो सकता है कि दो अलग-अलग समय क्षेत्रों में एक ही यूटीसी ऑफसेट होता है लेकिन अलग-अलग तारीख पर डेलाइट सेविंग टाइम स्विच करता है (दूसरे शब्दों में कुछ टाइमस्टैम्प गलत तरीके से मुद्रित किए जाएंगे)। वैसे भी, इस तरह के मामले में, आप अपने समय स्टाम्प इस तरह फ़ॉर्मेट कर सकते हैं (तारीख भी कुछ सेम से आते हैं):
<h:outputText value="#{someBean.timestamp}">
<f:convertDateTime type="both" dateStyle="default" timeStyle="default" timeZone="#{userProfile.timeZone}" />
</h:outputtext>
अब मुझे विशेषताओं की व्याख्या करते हैं:
- प्रकार - क्या दिखाने के लिए , दोनों का अर्थ दिनांक और समय
- दिनांक स्टाइल - तिथि की शैली (लघु, मध्यम, लंबी, पूर्ण, डिफ़ॉल्ट से बाहर)। आपको वास्तव में डिफ़ॉल्ट रूप से डिफ़ॉल्ट रूप से उपयोग करना चाहिए क्योंकि यह प्रत्येक लोकेल
- टाइम स्टाइल - दिनांक शैली के समान है लेकिन समय के लिए
- टाइमज़ोन - या तो यूटीसी ऑफसेट लेता है (इसलिए आपको कुछ भी बदलने की आवश्यकता नहीं है) या समय क्षेत्र का नाम (यानी अमेरिका/लॉस_एंजेलस)।
टैग वर्तमान दृश्य लोकेल का डिफ़ॉल्ट रूप से उपयोग करेगा, इसलिए आपको इस भाग के बारे में चिंता करने की ज़रूरत नहीं है, खासकर यदि आप लोकेल समर्थन को सही तरीके से सेट अप करते हैं।
अजाक्स के साथ संयोजन (बेन का जवाब देखें) काफी आसान होगा (मुझे लगता है)।
मैंने यह भी बताया कि आप इनवेंटरी तिथियां लिख सकते हैं, उन्हें क्लाइंट-साइड पर पार्स कर सकते हैं और फिर उन्हें ग्लोबलनाइज़ेशन के साथ प्रारूपित कर सकते हैं। यह मानते हुए कि आप पार्स है तारीख पहले से ही (यह प्रतिनिधित्व आप उपयोग करना चाहते पर निर्भर करता है, इसलिए मैं इस भाग को छोड़ देगा), यह ऐसा किया जा सकता है:
// you also have to assign the culture based on UIViewRoot locale and send it out with JavaScript
Globalize.culture(theLocale);
var formattedDateTime = Globalize.format(parsedDateTime, "f"); // this will use short date time format
जावा के विपरीत, वैश्वीकृत केवल कम है ("च ") और लंबी (" एफ ") तिथि और समय प्रारूप। तो मैंने छोटे का उपयोग करने का फैसला किया।
कृपया ध्यान रखें, कि वैश्वीकरण संस्कृतियों को हाइफ़न के माध्यम से अलग किया जाता है, अंडरस्कोर नहीं, इसलिए आपको "fr-CA" की आवश्यकता होती है, उदाहरण के लिए "fr_CA" नहीं।
कृपया मुझे बताएं कि क्या आप उस विधि का उपयोग करना चाहते हैं और अधिक ठोस उदाहरण की आवश्यकता है।
धन्यवाद! महान, पूरी तरह से जवाब। (बीटीडब्ल्यू - ध्यान दें कि मैं बेन हूं, लेकिन आपका उत्तर निश्चित रूप से वी :-) का हकदार है) – Ben
पहले उदाहरण में आपने लिखा था: "यदि यह आपके लिए काम नहीं कर रहा है, तो कृपया सुनिश्चित करें कि आपने सही ढंग से समर्थित लोकेशंस सेट किए हैं सामना कर रहा है-config.xml "। मुझे यकीन नहीं है कि उस समय कैसा था, लेकिन मैंने अभी जेएसएफ 2.2 के साथ परीक्षण किया है और चेहरे-config.xml की कोई आवश्यकता नहीं है यदि आप FacesContext का उपयोग करके लोकेशंस सेट अप करते हैं। Faces-config.xml का उपयोग ब्राउज़र को लोकेल चुनने के लिए किया जाता है। – karlihnos