我希望能够获得并使用在任何给定时间的特定小时内的所有时区的列表。因此,例如,如果我传递一个小时为上午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在几个月后发生变化,那也没关系,只要它在我检查的时候给我正确的时间。
是。它应该起作用。我在其他平台上也使用过同样的方法。只要你在询问时区中的当前时间,你就不必担心夏令时等。
话虽如此,在一小时和闰秒的顶部有一个微秒窗口,当你必须记住你在通话时得到的是一小时,而不一定是几秒钟后用户阅读屏幕时得到的。但我认为这不应该成为一个问题。