日付(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に属すると解釈される可能性があります。別の日。しかし、どのように動作を定義するのか、何が最善の回避策になるのか、私にはまだ手がかりがありません。
これは間違いなくタイムゾーン関連の問題です。
JSFは、日付/時刻変換でデフォルトでGMT(UTC)を使用します。したがって、サーバープラットフォームのデフォルトのタイムゾーンがGMT + X(GMT-Xではない)の場合、時刻は過去X時間で遡ります。時刻がすでに00:00:00(午前0時)である場合、日付は過去の1日前の日付になります。
とにかく機能要件を達成するための2つの標準的な方法があります。
次のコンテキストパラメータをweb.xml
に追加して、すべての日付/時刻変換にサーバープラットフォームのデフォルトのタイムゾーンを使用するようにJSFに指示します。
<context-param>
<param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
<param-value>true</param-value>
</context-param>
すべての<f:convertDateTime>
を変更して、webapp固有のタイムゾーンを明示的に指定します。ドイツを本拠地としていて、日付形式のパターンもこれを裏付けているので、CETを想定します。
<f:convertDateTime ... timeZone="CET" />
いずれの場合も、アプリケーション全体で非ユニバーサルまたは混合タイムゾーンを使用することはお勧めできません。すべてのレイヤーと環境のタイムゾーンをUTCに設定することをお勧めします。サーバーおよびフロントエンド層とプレゼンテーション層だけでなく、SQLデータベースとバックエンド層と永続層にもあります。このようにして、コードはタイムゾーンとDST(!)に関連する問題に影響されなくなり、必要に応じて、プレゼンテーション中にのみタイムゾーンの変更に集中できます。