web-dev-qa-db-ja.com

TimeZone IDのJava

Java TimeZone ..で奇妙な問題が発生しています。

TimeZone.getDefault()を呼び出すと、IDが「GMT + 02:00」のローカルタイムゾーンが得られます。面白いことに、このIDはTimeZone.getAvailableIDs()によって提供されるリストに表示されません。どうやら私のゾーンは「Etc/GMT + 2」のように見えます。

コンボにタイムゾーンを設定しようとしていますが、GMT + 02:00がリストにないため選択することはできません。何か案は?


更新:

一番下の行は-ID文字列に依存することはできません。ディスプレイIDはシステムによって異なるため、オフセットを使用する必要があります。

22
Dima

他のSOの質問を振り返ると、これはJava-on-Windowsの問題のようです。 この記事 、特に回答1マッピングの問題を解決できるウィキペディアのリンクへ。

4
Andreas_D

GMT + 02:00はカスタムIDであり、TimeZone.getAvailableIDs()(これは巨大です)の出力には表示されません。できることは、最初にオフセットを指定してから、指定されたオフセットの使用可能なIDを取得するようユーザーに求めることです。たとえば、GMT + 02:00の場合、次のコード部分:

for (String string : TimeZone.getAvailableIDs(TimeZone.getTimeZone(
        "GMT+02:00").getRawOffset())) {
    System.out.println(string);
}

次の出力が得られます。

 ART 
アフリカ/ブランタイア
アフリカ/ブジュンブラ
アフリカ/カイロ
アフリカ/ガボローネ
アフリカ/ハラレ
アフリカ/ヨハネスブルグ
アフリカ/キガリ
アフリカ/ルブンバシ
アフリカ/ルサカ
アフリカ/マプト
アフリカ/マセル
アフリカ/Mbabane
Africa/Tripoli
Asia/Amman
Asia/Beirut
Asia/Damascus
Asia/Gaza
Asia/Istanbul 
アジア/エルサレム
アジア/ニコシア
アジア/テルアビブ
 CAT 
 EET 
エジプト
 Etc/GMT -2 
ヨーロッパ/アテネ
ヨーロッパ/ブカレスト
ヨーロッパ/チシナウ
ヨーロッパ/ヘルシンキ
ヨーロッパ/イスタンブール
ヨーロッパ/カリーニングラード
 Europe/Kiev 
 Europe/Mariehamn 
 Europe/Minsk 
 Europe/Nicosia 
 Europe/Riga 
 Europe/Simferopol 
ヨーロッパ/ソフィア
ヨーロッパ/タリン
ヨーロッパ/ティラスポリ
ヨーロッパ/ウジゴロド
ヨーロッパ/ビリニュス
ヨーロッパ/ザポロージエ
イスラエル
リビア
トルコ

まだ大きいですが、今回は人間が閲覧できます。

33
Pascal Thivent

ジョーダ時間には定数DateTimeZone.UTC。そのクラスまたは定数が役立つ場合があります。 http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTimeZone.html

Java 8 UPDATE

Java 8にはZoneOffset.UTChttps://docs.Oracle.com/javase/8/docs/api/Java/time/ZoneOffset.html#UTC

2
Kirby

TimeZone.getAvailableIDs()を使用して、スラッシュの前の部分でグループ化し、2段階の選択にするとどうでしょうか。

2
fforw

任意のタイムゾーンは、「GMT」プラス/マイナスオフセットとして指定できます。 timezone doc は、これを「カスタムID」と呼びます。

ドロップダウンにデータを入力するには、特定の都市/オフセットのリストとタイムゾーンへの関連付けを考えた方が良いと思います。 getAvailableIDs()によって返される配列は巨大です-私のインストールでは586エントリです-そしてこれをユーザーに無理やり突っ込ませたくはありません。

1
kdgregory