2010-04-22 22 views
46

मेरे वेब एप्लिकेशन में मैं हाइबरनेट का उपयोग करके डेटा पुनर्प्राप्त करता हूं और इसे रिचफ़ेस डेटाटेबल में प्रदर्शित करता हूं।f: convertDateTime गलत दिनांक प्रदर्शित करता है

मेरी MySQL-table में "दिनांक" प्रकार का एक क्षेत्र है। जब मैं अपने बीन में लॉग इन करने के लिए इस फ़ील्ड को प्रिंट करता हूं, तो यह डेटाबेस से सही दिनांक दिखाता है (उदाहरण के लिए 2010-04-21)। लेकिन में अमीर: DataTable इसे इस तरह दिखाई देता है:

4/20/10

तो वहाँ 1 दिन का अंतर क्यों है!

मैंने "एफ: कन्वर्टडेटाइम" कनवर्टर जोड़ा और समय प्रदर्शित करने के लिए "प्रकार" विशेषता को "दोनों" पर सेट किया। तो अब यह पता चलता है:

4/20/10 10:00:00 PM पर

के लिए कोड "च: convertDateTime" मैं का उपयोग किया है:

<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/> 

तो यह f की तरह लगता है: convertDateTime कुछ समय तक सपने देखता है क्योंकि MySQL-table फ़ील्ड में कोई समय की जानकारी नहीं है!

मैं क्या गलत कर रहा हूं? सही तिथि प्रदर्शित करने के लिए मुझे क्या करने की ज़रूरत है?

धन्यवाद टॉम

उत्तर

2

आप शायद समय क्षेत्र के साथ मुद्दों कर रहे हैं।

Check this article उन्हें हल करने के तरीके पर।

इससे पहले, आप स्पष्ट रूप से <f:convertDataTime>

+0

मैं <च: convertDateTime> के समय क्षेत्र के विशेषता निर्धारित करने की कोशिश की है, लेकिन अब समय कहते हैं 11 बजे (क्योंकि मेरे समय क्षेत्र GMT + 1 है)। ऐसा लगता है कि मेरे समय को 10 पीएम यूटीसी में डिफॉल्ट कर रहा है। – Tom

+0

और क्या आपने अन्य विकल्पों को आजमाया? – Bozho

+0

हां। मैंने टाइमज़ोन को ServletContextListener में सेट किया है लेकिन परिणाम (बिल्कुल) वही था। मुख्य समस्या यह है कि मेरे दिनांक-मूल्य पर समय मानों का आविष्कार करता है (केवल एक तिथि है, कोई समय नहीं है)। हालांकि वर्तमान में उपयोग किए जाने वाले वर्कअराउंड को टाइमज़ोन जीएमटी + 2 पर सेट करना है, ताकि उत्पादन 4/20/10 22:00:00 के बजाय 4/21/10 00:00:00 हो। लेकिन यह एक आदर्श समाधान नहीं है :) – Tom

0

की timeZone विशेषता हम एक ही समस्या थी और एक नया JSF कनवर्टर एक SimpleDateFormat तारीख रूपांतरण के लिए new SimpleDateFormat(String pattern) के साथ बनाया का उपयोग करता है लेखन के साथ समाप्त हो गया सेट करने का प्रयास कर सकते हैं।

14

जेएसएफ चश्मा के अनुसार, एफ: कन्वर्टडेटाइम यूटीसी टाइमज़ोन (किसी भी वीएम टाइमज़ोन सेटिंग के बावजूद) के लिए डिफ़ॉल्ट है, जो आपके टाइमज़ोन से -1 घंटे (मानक समय) या -2 घंटे (ग्रीष्मकालीन समय) से अलग है।

हम इस तरह एक समय क्षेत्र के संपत्ति के साथ एक आवेदन scoped पेज सेम का उपयोग करें:

public TimeZone getTimeZone() { 
    return TimeZone.getDefault(); 
} 

फिर हम एक ईएल अभिव्यक्ति में संपत्ति का उपयोग करें:

<ice:outputText value="#{deliveryDate}"> 
    <f:convertDateTime type="both" timeZone="#{Application.timeZone}" /> 
</ice:outputText> 

लाभ यह है कि यह मानक पर विचार कर रहा है/गर्मी का समय स्वचालित रूप से।

+0

+1 है , इसी तरह आप अलग-अलग समय क्षेत्रों में उपयोगकर्ताओं के लिए स्थानीय समय प्रदर्शित कर सकते हैं – gaborsch

112

जेएसएफ डेट/टाइम कन्वर्टर्स के लिए यूटीसी टाइमज़ोन पर चूक जाता है। इसे ओवरराइड करने के लिए आपको प्रत्येक दिनांक/समय कनवर्टर में timeZone विशेषता सेट करने की आवश्यकता है। ईडीटी टाइमज़ोन का उपयोग करके एक उदाहरण यहां दिया गया है (मान लीजिए कि आप अमेरिका के पूर्व में हैं)।

<f:convertDateTime locale="en_US" type="both" dateStyle="short" timeZone="EDT" /> 

locale विशेषता केवल पूरा दिन/माह नाम स्वरूपण (यह अंग्रेजी हो जाता है) को नियंत्रित करता है।

आप डिफ़ॉल्ट UTC समयज़ोन ओवरराइड करने के लिए ऑपरेटिंग मंच डिफ़ॉल्ट समय क्षेत्र होने के लिए चाहते हैं, तो आप web.xml के लिए निम्न संदर्भ परम जोड़ने की जरूरत:

<context-param> 
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> 
    <param-value>true</param-value> 
</context-param> 

तो फिर तुम संपादित करने के लिए की जरूरत नहीं है प्रत्येक व्यक्ति जेएसएफ <f:convertXxx> टैग।

+3

संदर्भ-पैरा जेएसएफ 2.0 से पहले काम नहीं करेगा, है ना? कि बारे में एक लेख: http://planet.jboss.org/post/step_right_up_and_select_your_time_zone – Zeemee

+2

@Mulmoth: यह सही है, लेकिन यह पूरी तरह से सवाल टैग कि s संकेत/वह पहले से ही JSF उपयोग कर रहा है के रूप में ओ पी के लिए एक समस्या नहीं बनाना चाहिए 2.0। – BalusC

+0

आप सही हैं, मुझे टैग नहीं मिला। – Zeemee

0
<h:outputText id="dateId" value="#{item.date}"> 
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>