特定の時間内にいつでも該当するすべてのタイムゾーンのリストを取得して使用できるようにしたいと考えています。したがって、たとえば、午前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が変更されても、チェックした時点で正しい時刻が表示されれば問題ありません。