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

时间:2018-06-26 14:14:13

标签: java timezone-offset

我的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的时区(而不是一年中其他时间的时区)。

3 个答案:

答案 0 :(得分:2)

是的,可以检查一下。

final List<ZoneId> timeZoneByUtc = ZoneId.getAvailableZoneIds().stream().map(ZoneId::of)
        .filter(z -> z.getRules().getOffset(Instant.now()) == ZoneOffset.ofHours(-5))
        .collect(Collectors.toList());

更新 根据下面的评论,使用==运算符不利于比较对象,因此,可以使用下面的equals方法来进一步改善这一点。

final List<ZoneId> timeZoneByUtc = ZoneId.getAvailableZoneIds().stream().map(ZoneId::of)
        .filter(z -> z.getRules().getOffset(Instant.now()).equals(ZoneOffset.ofHours(-5)))
        .collect(Collectors.toList());

答案 1 :(得分:1)

首先确定何时是“现在”:使用Instant.now()(如果您想要一个一致的答案,请仅致电Instant.now())。

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

快乐的编码。

答案 2 :(得分:0)

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

美国/ Atikokan 美国/波哥大 美国/坎昆 美国/开曼 美国/珊瑚港 美国/底特律 美国/埃鲁尼佩 美国/韦恩堡 美国/大突厥 美国/瓜亚基尔 美国/哈瓦那 ...