Java 如何从时区获得偏移量

Java 如何从时区获得偏移量,java,date,java-time,timezone-offset,Java,Date,Java Time,Timezone Offset,我只是想从时区获得偏移量(+02:00),但似乎它不适用于IST、JST、EST和BET TimeZone exchangeTimeZone = banker.getTimeZone(); String timeZone = ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID())).getOffset().getId(); 返回错误“未知时区ID:EST”。日期对象对我不可用。使用 您可以尝试为您得到的缩写查找映射: publicsta

我只是想从时区获得偏移量(+02:00),但似乎它不适用于IST、JST、EST和BET

TimeZone exchangeTimeZone = banker.getTimeZone();   
String timeZone = ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID())).getOffset().getId();
返回错误“未知时区ID:EST”。日期对象对我不可用。

使用


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

publicstaticzoneid getfrom缩写(字符串缩写){
返回ZoneId.of(ZoneId.SHORT_id.get(缩写));
}
您可以获得如下
main
中所示的偏移量:

publicstaticvoidmain(字符串[]args){
ZoneId Isteequivalent=GetFrom缩写(“IST”);
ZoneId Esteequivalent=GetFrom缩写(“EST”);
ZoneId JSTEEquivalent=GetFrom缩写(“JST”);
ZoneId betEquivalent=GetFrom缩写(“BET”);
ZonedDateTime istNow=ZonedDateTime.now(Isteequivalent);
ZonedDateTime estNow=ZonedDateTime.now(等效);
ZonedDateTime jstNow=ZonedDateTime.now(JSTE等效);
ZonedDateTime betNow=ZonedDateTime.now(等同于betNow);
System.out.println(“IST-->”+isteEquivalent+“带偏移量”+istNow.getOffset());
System.out.println(“EST-->”+esteEquivalent+“带偏移量”+estNow.getOffset());
System.out.println(“JST-->”+jsteequivalent+”带偏移量“+jstNow.getOffset());
System.out.println(“BET-->”+betEquivalent+“带偏移量”+betNow.getOffset());
}
输出是

IST-->亚洲/加尔各答,偏移量+05:30
东部标准时间-->-05:00,偏移量为-05:00
JST-->亚洲/东京,偏移量+09:00
打赌-->美国/圣保罗,带偏移量-03:00
如您所见,
EST
没有区域名称,只有偏移量。

TimeZone.toZoneId() 刚刚运行时的输出:

-05:00

与您在代码中使用的方法的一个参数ZoneId.相反,
TimeZone.toZoneId()
会处理不推荐使用的三个字母缩写(根据您的情况和喜好,这可能被视为优点或缺点)。因此,上述代码也适用于许多这样的三字母缩写,包括EST

我只是在犹豫是否包含上面的第一行代码。它有几个问题:我们不应该在代码中创建老式的
TimeZone
对象,而应该依赖现代的
ZonedId
和来自java.time的相关类,现代的java日期和时间API。我们也不应该依赖三个字母的时区缩写。它们被弃用,没有标准化,并且通常模棱两可。例如,EST可能意味着澳大利亚东部标准时间或北美东部标准时间。为了增加混乱,有些人会希望你在夏天得到东部时间和夏季时间(DST)。使用
时区
您不需要。你得到一个全年使用标准时间的时区。AST、PST和CST的情况并非如此


然而,您通常无法控制从API获得的内容。如果你不幸得到了一个ID为EST的老式
时区对象,上面的代码显示了进入java.time领域所需的转换。

这些不是时区-它们有点“时区位”(时区内时段的缩写)。例如,英国在格林尼治标准时间和英国夏令时之间有所不同,但实际时区ID为“欧洲/伦敦”。时区的三个字母缩写不明确,应尽可能避免使用。它们中的大多数可以引用多个实时时区。我没有其他选择。如果你能解释一下我们如何克服这个问题,那将是一个很大的帮助。你需要硬编码一张地图,上面有你需要处理的每一个缩写词的偏移量。
ZonedDateTime.now(ZoneId.of(exchangeTimeZone.getID(), ZoneId.SHORT_IDS))
             .getOffset().getId();
    // 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);