1

我希望能够在任何给定时间获取和使用在特定小时内的所有时区列表。因此,例如,如果我传递一个时间为上午 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 在几个月后发生变化,这无关紧要,只要在我检查它的那一刻给我正确的时间。

4

1 回答 1

0

是的。它应该工作。我在其他平台上使用过同样的方法。只要您在时区询问当前时间,您就不必担心夏令时等。

话虽如此,当您必须记住您在呼叫的瞬间而不是在用户阅读屏幕时的几秒钟后获得小时时,小时的顶部和闰秒有一个微秒窗口。但我不认为这应该是一个问题。

于 2012-12-10T20:47:42.020 回答