1

特定の時間内にいつでも該当するすべてのタイムゾーンのリストを取得して使用できるようにしたいと考えています。したがって、たとえば、午前7時のカレンダーオブジェクトを渡す場合、メソッドは、現在午前7時である世界のすべてのゾーンを返す必要があります。

現在、利用可能なすべてのタイムゾーンをトラバースし、それぞれをカレンダーオブジェクトと照合し、1時間以内にゾーンが配列に追加されている場合は、これを実行しています。

private List<String> getAllTimeZones(Calendar date) {
    List<String> ret = new ArrayList<String>();
    String[] timezones = TimeZone.getAvailableIDs();
    for(String timezone : timezones) {
        Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone(timezone));
        Integer zoneHour = currentTime.get(Calendar.HOUR_OF_DAY);
        Integer dateHour = date.get(Calendar.HOUR_OF_DAY);
        if(zoneHour.equals(dateHour)) {
            ret.add(timezone);
        }
    }
    return ret;
}

この方法をこのように使用できます(この例では、午前7時を通過しています)。現在、東部標準時の午前9時なので、結果は現在午前7時のすべてのタイムゾーンになります。

Calendar date = Calendar.getInstance();
date.set(Calendar.HOUR_OF_DAY, 7);
List<String> zones = getAllTimeZones(date);
for(String zone : zones) {
    System.out.println(zone);
}

これにより、現在このリストが返されます(もちろん、別の時間であれば別のリストになります)。

America/Boise
   America/Cambridge_Bay
   America/Chihuahua
   America/Dawson_Creek
   America/Denver
   America/Edmonton
   America/Hermosillo
   America/Inuvik
   America/Mazatlan
   America/Ojinaga
   America/Phoenix
   America/Shiprock
   America/Yellowknife
   Canada/Mountain
   Etc/GMT+7
   MST
   MST7MDT
   Mexico/BajaSur
   Navajo
   PNT
   SystemV/MST7
   SystemV/MST7MDT
   US/Arizona
   US/Mountain

これは、現在特定の時間(この例では午前7時)であるすべてのタイムゾーンを取得するための信頼できる方法ですか?現在の時間と比較しているので、これは夏時間を考慮に入れていますか?そして最後になりましたが、これを行うためのより効率的な方法はありますか?

更新:以下の回答で誰かが指摘したように(しかし明確にすることを拒否しています)、私が行っているのは基本的にタイムゾーンをカレンダーオブジェクトに設定し、オブジェクトをリアルタイムで取得することなので、オフセットを計算する必要がありますか?これらのメソッドから取得したデータは即座に使用され、保存する必要がないため、数か月後にDSTが変更されても、チェックした時点で正しい時刻が表示されれば問題ありません。

4

1 に答える 1

0

はい。動作するはずです。私は他のプラットフォームでもこれと同じアプローチを使用しました。タイムゾーンで現在の時刻を入力している限り、夏時間などを気にする必要はありません。

そうは言っても、時間の上部にマイクロ秒ウィンドウがあり、ユーザーが画面を読んだときに必ずしも秒後ではなく、通話の瞬間に時間を取得することを覚えておく必要がある場合はうるう秒のウィンドウがあります。しかし、それは問題ではないと思います。

于 2012-12-10T20:47:42.020 に答える