如何从TimeZone获取偏移

问题描述

我只是想从TimeZone获取偏移量(+02:00),但似乎不适用于IST,JST,EST和BET。

TimeZone exchangeTimeZone = banker.getTimeZone();   
String timeZone = zoneddatetime.Now(ZoneId.of(exchangeTimeZone.getID())).getoffset().getId();

它返回错误“未知的时区ID:EST”。日期对象对我不适合。

解决方法

使用ZoneId.SHORT_IDS

ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID(),ZoneId.SHORT_IDS))
             .getOffset().getId();
,

您可以尝试为您找到的缩写查找映射:

public static ZoneId getFromAbbreviation(String abbreviation) {
    return ZoneId.of(ZoneId.SHORT_IDS.get(abbreviation));
}

您可以像在此main中获得偏移量:

public static void main(String[] args) {
    ZoneId istEquivalent = getFromAbbreviation("IST");
    ZoneId estEquivalent = getFromAbbreviation("EST");
    ZoneId jstEquivalent = getFromAbbreviation("JST");
    ZoneId betEquivalent = getFromAbbreviation("BET");
    ZonedDateTime istNow = ZonedDateTime.now(istEquivalent);
    ZonedDateTime estNow = ZonedDateTime.now(estEquivalent);
    ZonedDateTime jstNow = ZonedDateTime.now(jstEquivalent);
    ZonedDateTime betNow = ZonedDateTime.now(betEquivalent);
    System.out.println("IST --> " + istEquivalent + " with offset " + istNow.getOffset());
    System.out.println("EST --> " + estEquivalent + " with offset " + estNow.getOffset());
    System.out.println("JST --> " + jstEquivalent + " with offset " + jstNow.getOffset());
    System.out.println("BET --> " + betEquivalent + " with offset " + betNow.getOffset());
}

输出为

IST --> Asia/Kolkata with offset +05:30
EST --> -05:00 with offset -05:00
JST --> Asia/Tokyo with offset +09:00
BET --> America/Sao_Paulo with offset -03:00

如您所见,EST根本没有区域名称,只有一个偏移量。

,

TimeZone.toZoneId()

    // Never do this in your code: Get a TimeZone with ID EST for demonstration only.
    TimeZone tz = TimeZone.getTimeZone("EST");
    
    String currentOffsetString = ZonedDateTime.now(tz.toZoneId())
            .getOffset()
            .getId();
    System.out.println(currentOffsetString);

刚刚运行时的输出:

-05:00

与您在代码中使用的单参ZoneId.of方法相反,TimeZone.toZoneId()确实处理了已弃用的三个字母的缩写(视您的情况和您的情况而定,这是一个优点还是一个缺点)味道)。因此,上面的代码也可以使用许多这样的三个字母缩写,包括EST。

我只是在犹豫包括上面的第一行代码。它有几处问题:我们不应该在代码中创建老式的TimeZone对象,而要依赖现代ZonedId和来自Java.time(现代Java日期和时间API)的相关类。我们也不应该依赖三个字母的时区缩写。它们已弃用,不是标准化的,通常是模棱两可的。例如,EST可能表示澳大利亚东部标准时间或北美东部标准时间。为了增加混乱,有些人会期望您在夏天获得东部时间(DST)。使用TimeZone,您不必。您将获得一个全年使用标准时间的时区。对于AST,PST或CST,不是也是如此。

但是,您通常无法控制从API获得的信息。而且,如果您很不幸无法获得ID为EST的老式TimeZone对象,那么上面的代码将向您显示进入java.time领域所需的转换。