我希望能够在任何给定时间获取并使用特定小时内所有时区的列表。因此,例如,如果我传递日历对象的时间为早上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几个月后更改无关紧要,只要它在我检查时给我正确的时间。
答案 0 :(得分:0)
是。它应该工作。我在其他平台上使用过相同的方法。只要你在时区要求当前时间,就不必担心夏令时等等。
话虽如此,在小时的顶部还有微秒钟窗口,当你必须记住你在通话瞬间得到小时时,嘻哈秒钟,而不是几秒钟后用户读取屏幕。但我认为这不应成为一个问题。