私のアプリケーションのユーザーはグローバルですが、ほとんどのユーザーは好みの 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 ロケール処理レベルで変更します)。