Java不会生成正确的时区信息

cur*_*us1 8 java timezone

我在Windows机器上运行Java程序.我正在尝试获取时区列表及其相关信息.这是完整的程序:

    String[] allTimeZones = TimeZone.getAvailableIDs();
    Date now = new Date();
    for (int i = 0; i < allTimeZones.length; i++) {
        TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]);
        System.out.format("%s;%s; %f \n", 
                          allTimeZones[i],
                          tz.getDisplayName(), 
                          (float) (tz.getOffset(now.getTime())/3600000.0));
    }
Run Code Online (Sandbox Code Playgroud)

其中一个生成的时区具有以下信息:

America/New_York;东部标准时间; -4.000000

这令人费解.此时,纽约正处于东夏夏令时.所以上面的信息不对.

有谁知道如何让Java生成

America/New_York;东部标准时间; -5.000000

或类似的东西

America/New_York;东夏夏令时; -4.000000

感谢帮助!

问候

Jim*_*thy 2

使用getDisplayName(daylight, style),传入truefor daylight。这将打印:

America/New_York;Eastern Daylight Time; -4.000000
Run Code Online (Sandbox Code Playgroud)

但是您必须确定当前时间是否处于夏令时(否则它将始终返回“夏令时”,即使在秋季和冬季也是如此)。这应该可以解决问题:

String[] allTimeZones = TimeZone.getAvailableIDs();
Date now = new Date();
for (int i = 0; i < allTimeZones.length; i++) {
    TimeZone tz = TimeZone.getTimeZone(allTimeZones[i]);
    System.out.format("%s;%s; %f \n", allTimeZones[i], 
            tz.getDisplayName(tz.inDaylightTime(now), TimeZone.LONG), 
            (float) (tz.getOffset(now.getTime())/3600000.0));
}
Run Code Online (Sandbox Code Playgroud)