web-dev-qa-db-ja.com

f:convertDateTimeに誤った日付が表示される

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がしばらく夢見るように思われます。

私は何を間違えていますか?正しい日付を表示するには何をする必要がありますか?

トムに感謝

48
Tom

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>タグをすべて編集する必要はありません。

113
BalusC

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>

利点は、標準/夏時間を自動的に考慮することです。

16
Zeemee

タイムゾーンに問題がある可能性があります。

この記事を確認してください それらの解決方法について。

その前に、<f:convertDataTime>timeZone属性を明示的に設定してみてください。

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

同じ問題があり、日付変換にnew SimpleDateFormat(String pattern)で作成されたSimpleDateFormatを使用する新しいJSFコンバーターを作成することになりました。

0
silb