我希望能够在任何给定时间获取和使用在特定小时内的所有时区列表。因此,例如,如果我传递一个时间为上午 7 点的日历对象,则该方法应返回世界上当前为上午 7 点的所有区域。
现在,我通过遍历所有可用时区来执行此操作,根据日历对象检查每个时区,如果该时区在一小时内,则将其附加到数组中。
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 在几个月后发生变化,这无关紧要,只要在我检查它的那一刻给我正确的时间。