如何通过UTC偏移量获取时区?



>我有 UTC 偏移量 -05:00,我想通过偏移量获取时区名称。

ZoneOffset offset = ZoneOffset.of("-05:00");
System.out.println(offset.getId()); //prints -05:00

我想得到这样的结果:

America/Chicago
America/Eirunepe
Etc/GMT+5
Mexico/General 
...

我想要现在偏移-05:00时区(而不是一年中其他时间的时区(。

是的,你可以做到,看看这个。

final List<ZoneId> timeZoneByUtc = ZoneId.getAvailableZoneIds().stream().map(ZoneId::of)
.filter(z -> z.getRules().getOffset(Instant.now()).equals(ZoneOffset.ofHours(-5)))
.collect(Collectors.toList());
public class Main {
public static void main(String[] args) {
TimeZone tz = TimeZone.getTimeZone("GMT-05:00");
String a[] = TimeZone.getAvailableIDs(tz.getOffset(System.currentTimeMillis()));
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}

O/P

美洲/阿提科坎 美洲/波哥大 美洲/坎昆 美洲/开曼群岛 美洲/Coral_Harbour 美洲/底特律 美洲/埃鲁内佩 美洲/Fort_Wayne 美洲/Grand_Turk 美洲/瓜亚基尔 美洲/哈瓦那 ...

首先确定何时是"现在":使用Instant.now()(如果您想要一致的答案,请只拨打Instant.now()一次(。

然后遍历所有可用的时区,并包括现在偏移量为 -05:00 的时区。首先从ZoneId.getAvailableZoneIds()中获取字符串形式的可用时区 ID。对于每个对象,从ZoneId.of(String)获取相应的ZoneId对象。现在有不同的方法可以获得偏移量。一个是yourZoneId.getRules().getOffset(rightNow)(其中rightNow是你的Instant(。这为您提供了一个ZoneOffset对象,您可以使用.equals(Object)将其与问题中的offset进行比较。