web-dev-qa-db-ja.com

JSF convertDateTimeは前日をレンダリングします

日付(Date一時タイプとして)は、次のように私のDBに格納されます:31.10.2012
UIに表示すると、デフォルトで次のようにレンダリングされます:2012-10-31
<f:convertDateTime pattern="dd.MM.yyyy" />を使用して変換すると、予期せず
30.10.2012

同じ日付と同じフォーマット文字列を入力したSimpleDateconverterは、期待どおり31.10.2012を返します。

何が欠けていますか?

ありがとうございました

編集:Timestampとして保存された日付の場合、同じ変換で正しい結果が得られるため、正確に真夜中と解釈されるDateが何らかの原因で2に属すると解釈される可能性があります。別の日。しかし、どのように動作を定義するのか、何が最善の回避策になるのか、私にはまだ手がかりがありません。

29
kostja

これは間違いなくタイムゾーン関連の問題です。

JSFは、日付/時刻変換でデフォルトでGMT(UTC)を使用します。したがって、サーバープラットフォームのデフォルトのタイムゾーンがGMT + X(GMT-Xではない)の場合、時刻は過去X時間で遡ります。時刻がすでに00:00:00(午前0時)である場合、日付は過去の1日前の日付になります。

とにかく機能要件を達成するための2つの標準的な方法があります。

  1. 次のコンテキストパラメータをweb.xmlに追加して、すべての日付/時刻変換にサーバープラットフォームのデフォルトのタイムゾーンを使用するようにJSFに指示します。

    <context-param>
        <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
        <param-value>true</param-value>
    </context-param>
    
  2. すべての<f:convertDateTime>を変更して、webapp固有のタイムゾーンを明示的に指定します。ドイツを本拠地としていて、日付形式のパターンもこれを裏付けているので、CETを想定します。

    <f:convertDateTime ... timeZone="CET" />
    

いずれの場合も、アプリケーション全体で非ユニバーサルまたは混合タイムゾーンを使用することはお勧めできません。すべてのレイヤーと環境のタイムゾーンをUTCに設定することをお勧めします。サーバーおよびフロントエンド層とプレゼンテーション層だけでなく、SQLデータベースとバックエンド層と永続層にもあります。このようにして、コードはタイムゾーンとDST(!)に関連する問題に影響されなくなり、必要に応じて、プレゼンテーション中にのみタイムゾーンの変更に集中できます。

以下も参照してください。

80
BalusC