web-dev-qa-db-ja.com

ロケールから現在の時刻とTimeZoneを取得する方法は?

私はこの奇妙な問題を抱えています。ロケールを使用してカレンダーを作成すると、TimeZoneはローカルのカレンダーに戻ります

public void start(Locale locale){
    String s = locale.getDisplayName(); 
    System.err.println(s);
    Calendar c = new GregorianCalendar(locale);
    System.err.println(c.getTimeZone());
}

そしてこれは出力です:

 español (Argentina)
 Sun.util.calendar.ZoneInfo[id="Europe/Bucharest", //etc more useless date here....

特定のロケールから適切な時刻を取得するにはどうすればよいですか?

18

簡単に言えば、それはできません。

長い答え:「ロケールに適したタイムゾーン」などはありません。これは、複数のタイムゾーンを持つ国がいくつかあるためです(たとえば、米国)。タイムゾーンは別の概念です。

とにかく、あなたはあなたの問題を解決しようとしています。 Webアプリケーションを作成していて、タイムゾーンがサーバーのデフォルトに戻っていることがわかります。それは典型的な状況です。 Locale.getDefault()TimeZone.getDefault()はどちらもサーバー関連の情報を返します。 JVMには、「適切な」タイムゾーンを知る方法がありません。それで、あなたはそれについて何ができますか?

  1. タイムゾーン情報をユーザープロファイル(ある場合)に追加するか、タイムゾーンコンボボックスを作成できます(ユーザーが実行時に切り替えることができるようにします)。次に、適切なオブジェクトをDateFormatインスタンスに割り当てると、タイムゾーンが自動的に変換されます。
  2. currentタイムゾーンオフセットは、JavaScript日付オブジェクトの getTimezoneOffsetを介してクライアントから読み取ることができます。 () 関数で、どういうわけか(AJAX)サーバーに送信します。この方法の問題は、そのオフセットを持ついくつかのタイムゾーンがあり、選択したタイムゾーンが他の日付には不適切である可能性があることです。もちろん、時間変更日の前後のデータをポーリングすることでタイムゾーンを推測できますが、これはおそらくあなたがしたいことではありません。
  3. フォーマットされていない時間をクライアントに送信することができます(たとえば、UTCに関連して ISO 8601日時フォーマット または エポックのUNIX時間 として書き込まれます)。 Globalize または Dojo 日付と時刻をフォーマットします。

これらの3つの選択肢から、私は常に1番を選びます。タイムゾーン情報をユーザープロファイルに入力することで、現在のWebブラウザーなどに関係なく、ユーザーの優先タイムゾーンが何であるかが確実にわかります。一部の国のユーザーは、他の国を訪問しているときにアプリケーションを使用したいと思うかもしれません...

41
Paweł Dyda