Java获取特定时间的所有时区

时间:2012-12-10 14:17:57

标签: java calendar timezone dst

我希望能够在任何给定时间获取并使用特定小时内所有时区的列表。因此,例如,如果我传递日历对象的时间为早上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几个月后更改无关紧要,只要它在我检查时给我正确的时间。

1 个答案:

答案 0 :(得分:0)

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

话虽如此,在小时的顶部还有微秒钟窗口,当你必须记住你在通话瞬间得到小时时,嘻哈秒钟,而不是几秒钟后用户读取屏幕。但我认为这不应成为一个问题。