2010-04-22 89 views
46

在我的Web應用程序中,我使用Hibernate檢索數據並將其顯示在RichFaces數據表中。f:convertDateTime顯示錯誤日期

在我的MySQL表中有一個類型爲「date」的字段。當我將這個字段打印到Bean的日誌中時,它會顯示數據庫中的正確日期(例如2010-04-21)。但在豐富:dataTable中它顯示是這樣的:

10年4月20日

因此,有1天的差異!

我添加了「f:convertDateTime」轉換器,並將「type」屬性設置爲「both」以顯示時間。所以,現在它顯示:

10年4月20日晚上10:00:00

守則 「F:convertDateTime」 我用:

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

所以看起來像f:convertDateTime夢想了一段時間,因爲MySQL表中沒有時間信息!

我在做什麼錯了?我需要做什麼才能顯示正確的日期?

感謝湯姆

回答

2

你可能有與時區的問題。

Check this article關於如何解決它們。

在這之前,你可以嘗試明確設置的<f:convertDataTime>

+0

我試着設置的timeZone屬性,但現在時間說11 PM(因爲我的時區是GMT + 1)。看起來像默認我的時間到了UTC的晚上10點。 – Tom 2010-04-22 10:24:42

+0

,你有沒有嘗試其他的選擇? – Bozho 2010-04-25 05:55:15

+0

是的。我把時區設置在ServletContextListener中,但結果(當然)是相同的。核心問題是將時間值發送到我的日期值(只有一個日期,沒有時間)。但是,我目前使用的解決方法是將時區設置爲GMT + 2,以便輸出爲4/21/10 00:00:00而不是4/20/10 22:00:00。但那不是一個理想的解決方案:) – Tom 2010-04-29 06:07:58

0

timeZone屬性,我們有同樣的問題,並結束了與編寫使用與new SimpleDateFormat(String pattern)的日期轉換來創建一個SimpleDateFormat的一個新的JSF轉換器。

14

根據JSF規範,f:convertDateTime默認爲UTC時區(不管任何VM時區設置),它與您的時區相差-1小時(標準時間)或-2小時(夏令時)。

我們使用一個應用程序作用域的頁面Bean用的timeZone屬性是這樣的:

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

然後我們使用屬性在EL表達式:

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

的優點是,它正在考慮標準/夏令時自動。

+0

+1 ,類似的方式可以爲不同時區的用戶顯示本地時間 – gaborsch 2013-09-09 19:09:29

112

對於日期/時間轉換器,JSF默認爲UTC時區。要覆蓋此設置,您需要在每個日期/時間轉換器中設置timeZone屬性。以下是使用EDT時區的示例(假設您位於美國東部)。

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

locale屬性只控制全日/月名稱格式(它變成英文)。

如果要覆蓋默認的UTC時區是操作平臺默認的時區,則需要以下上下文PARAM添加到web.xml

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

那麼你不需要編輯每個單獨的JSF <f:convertXxx>標籤。

+3

在JSF 2.0之前,上下文參數不起作用,是嗎? 關於這篇文章:http://planet.jboss.org/post/step_right_up_and_select_your_time_zone – Zeemee 2011-07-06 05:51:44

+2

@穆爾穆特:這是正確的,但這絕對不應該成爲OP的問題,因爲問題標籤暗示他/他已經在使用JSF 2.0。 – BalusC 2011-07-06 05:58:26

+0

你說得對,我沒有看到標籤。 – Zeemee 2011-07-06 07:13:41

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