Webアプリケーションでは、Hibernateを使用してデータを取得し、RichFaces dataTableに表示します。
私のMySQLテーブルには、「date」タイプのフィールドがあります。このフィールドをBeanのログに出力すると、データベースからの正しい日付が表示されます(例:2010-04-21)。しかし、rich:dataTableでは次のように表示されます。
4/20/10
つまり1日の差異があります!
「f:convertDateTime」コンバーターを追加し、時間も表示するために「type」属性を「both」に設定しました。だから今それは示しています:
4/20/10 10:00:00午後
私が使用した「f:convertDateTime」のコード:
<f:convertDateTime locale="locale.US" type="both" dateStyle="short"/>
したがって、MySQLテーブルフィールドには時間情報がないため、f:convertDateTimeがしばらく夢見るように思われます。
私は何を間違えていますか?正しい日付を表示するには何をする必要がありますか?
トムに感謝
JSFは、日付/時刻コンバーターのデフォルトはUTCタイムゾーンです。これをオーバーライドするには、すべての日付/時刻コンバーターでtimeZone
属性を設定する必要があります。 EDTタイムゾーンを使用した例を次に示します(米国の東にいると仮定します)。
<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>
その後、個々のJSF <f:convertXxx>
タグをすべて編集する必要はありません。
JSF仕様によると、f:convertDateTimeはUTCタイムゾーン(VMタイムゾーン設定に関係なく)にデフォルト設定されます。これは、タイムゾーンと-1時間(標準時間)または-2時間(夏)異なります)時間)。
次のようなtimeZoneプロパティを持つアプリケーションスコープのページBeanを使用します。
public TimeZone getTimeZone() {
return TimeZone.getDefault();
}
次に、EL式でプロパティを使用します。
<ice:outputText value="#{deliveryDate}">
<f:convertDateTime type="both" timeZone="#{Application.timeZone}" />
</ice:outputText>
利点は、標準/夏時間を自動的に考慮することです。
<h:outputText id="dateId" value="#{item.date}">
<f:convertDateTime for="dateId" type="date" dateStyle="long" locale="pl"/> </h:outputText>
同じ問題があり、日付変換にnew SimpleDateFormat(String pattern)
で作成されたSimpleDateFormatを使用する新しいJSFコンバーターを作成することになりました。