0

私のアプリケーションのユーザーはグローバルですが、ほとんどのユーザーは好みの TimeZone 情報を保存するユーザー プロファイルを持っていません。そのため、代わりに言語設定に基づいて最善を尽くして推測したいと思います。

たとえば、言語選択ボタンを使用して en_US を選択した場合、ニューヨーク TZ で日付をレンダリングし、en_GB の場合はロンドン TZ で、de_DE の場合はベルリン TZ で、というようにレンダリングします。

次のようなコードでStripes Frameworkを使用しています...

<stripes:format value="${someDateValue}" formatType="datetime" formatPattern="medium"/>

...多くの場所で、それらすべてを調べて別のもの (カスタムタグなど) に更新したくないでしょう。また、 JavaScript AJAX ソリューションも避けたいと思います (ほとんどの場合、多くの strips:format タグを更新する原因にもなると思うからです)。

Stripes Framework はリクエストの Locale にデフォルトの DateFormat を使用し、それはすべて機能します (日付形式が変更されるため)。ただし、すべてのタイムゾーンはサーバー TZ (GMT) のままです。

したがって、 DateFormat.getDateInstance() によって返されるデフォルトの DateFormat-s の TimeZone を設定する方法が必要ですが、それらが返される前に同様の方法が必要ですが、その方法がわかりません。

私がこれまでに試したことは、返された DateFormat インスタンスに設定することでしたが、もちろん値によって返されるため、機能しませんでした:

DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("en_US"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Greenwich Mean Time
df.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Eastern Standard Time
df = DateFormat.getDateInstance(DateFormat.SHORT, new Locale("en_US"));
System.out.println(df.getTimeZone().getDisplayName()); // prints Greenwich Mean Time again, although if this approach were successful it would print Eastern Standard Time

これにアプローチする最善の方法はありますか?

私のプラン B は、カスタム Stripes タグで、日付をフォーマットする多くの場所で変更しますが、そのルートに進む前に、簡単な解決策 (Stripes フックまたは方法) が不足していないことを確認したいと思います。より基本的な Java ロケール処理レベルで変更します)。

4

2 に答える 2

0

ユーザーのタイムゾーン オフセットは、HTTP ヘッダーでは保持されません。一般に、次の 2 つのアプローチがあります。

  1. ユーザーが設定できるようにタイムゾーン設定を使用してユーザープロファイルを作成します
  2. javascript の Date オブジェクトを使用してタイムゾーンを自動的に検出し、getTimezoneOffset()ajax を使用してサーバーに投稿します。たとえば、これでウェブを検索します。

または、両方を組み合わせることもできます

于 2013-09-05T07:33:19.387 に答える
0

このように実装すると、うまく動作するように見えます:

  • カスタム DateFormatter を追加する Custom Stripes FormatterFactory
  • DateFormatter は、ThreadLocal からセッションを取得して、セッションからタイムゾーン オフセットを取得し、それを使用して Date のレンダリングに使用される DateFormat を調整します。
  • Interceptor は、セッションからのタイムゾーン オフセットを ThreadLocal に格納します。
  • ページでの JQuery AJAX 呼び出しにより、JavaScript によって取得されたタイムゾーン オフセットがセッションに格納されるバックエンドに送信されます。
于 2013-09-07T23:19:49.550 に答える