如何从时区偏移

How to get offset from 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

与您在代码中使用的 one-arg ZoneId.of 方法相反,TimeZone.toZoneId() 确实处理已弃用的三字母缩写(这可能被视为优势或劣势,具体取决于你的情况和你的品味)。所以上面的代码也适用于许多这样的三字母缩写,包括 EST。

我只是犹豫地加入了上面的第一行代码。它有几处错误:我们不应该在我们的代码中创建 old-fashioned TimeZone 对象,而是依赖现代 ZonedId 和来自 java.time 的相关 类,现代 Java 日期和时间 API。我们也不应该依赖三个字母的时区缩写。它们已被弃用,未标准化且通常模棱两可。例如,EST 可能表示澳大利亚东部标准时间或北美东部标准时间。为了增加混淆,有些人会希望您在夏季获得东部时间和夏令时 (DST)。使用 TimeZone 你不需要。您得到一个全年使用标准时间的时区。对于 AST、PST 和 CST,不是

然而,您通常无法控制从 API 中获得的内容。如果你不幸获得了一个 ID 为 EST 的 old-fashioned TimeZone 对象,上面的代码向你展示了进入 java.time.[=18= 领域所需的转换]