29

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

SimpleDateconverter同じ日付と同じフォーマット文字列を与えられた は、予想どおり を返します31.10.2012

私は何が欠けていますか?

ありがとうございました

EDIT :Timestamp同じ変換として保存された日付の場合、正しい結果が得られるためDate、正確な真夜中として解釈され、2つの異なる日に属すると解釈される可能性があると思われます。しかし、動作を定義する場所と最善の回避策はまだわかりません。

4

1 に答える 1

82

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

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

いずれにせよ、機能要件を達成するための標準的な方法が 2 つあります。

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

    <context-param>
        <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name>
        <param-value>true</param-value>
    </context-param>
    
  2. every<f:convertDateTime>を変更して、webapp 固有のタイムゾーンを明示的に指定します。あなたはドイツに拠点を置いており、日付形式パターンもこれを確認しているため、CET であると想定します。

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

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

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

于 2012-09-10T12:25:42.220 に答える