为什么喀土穆的偏移量为 0?时区有错误吗?

Why does offset for Khartoum is 0? Is there a bug in TimeZones?

为什么会出现下面的代码:

System.out.println("Khartoum offset: " + TimeZone.getTimeZone("Asia/Khartoum").getRawOffset());
// GMT+2

System.out.println("Moscow offset: " + TimeZone.getTimeZone("Europe/Moscow").getRawOffset());
// GMT+3

System.out.println("Cairo offset: " + TimeZone.getTimeZone("Africa/Cairo").getRawOffset());
// GMT+2

产生这个奇怪的输入:

Khartoum offset: 0, why is this 0??? It should have been 7200000
Moscow offset: 10800000 // 3 hours, which is OK for GMT+3
Cairo offset: 7200000 // 2 hours, which is OK for GMT+2

如果您在 google 中键入 Khartoum time,您会发现喀土穆有 GMT+2(与 "Cairo" 相同)。

UPD: System.out.println(TimeZone.getTimeZone("Africa/Khartoum").getRawOffset()); 打印出 10800000 基本上是 GMT+3。它不应该打印 7200000(对应于 GMT+2)吗(证明:这个怎么样:ideone.com/sm2SHC)?

有关支持的时区标识符列表,请参阅 TimeZone.getAvailableIds()"Asia/Khartoum" 似乎不在其中。

TimeZone.getTimeZone(String) 的 javadoc 说

Returns: the specified TimeZone, or the GMT zone if the given ID cannot be understood.

更多

另一方面,如果您勾选 "Africa/Khartoum"

TimeZone.getTimeZone("Africa/Khartoum").getRawOffset()

它returns 7200000(至少在我尝试的时候)。

喀土穆位于非洲不在亚洲,TZDB also has this view,所以使用:

Africa/Khartoum

否则旧时区-API 将回到 GMT。

如果您怀疑还有另一个 "Khartoum",例如 "Asia/Khartoum", 你可以写出代码来解开你的疑惑:

String[] strings = TimeZone.getAvailableIDs();

for (String s : strings) {
    if (s.contains("Khartoum")) {
        System.out.println(s);
    }
}

输出是(即使在Java 10)

Africa/Khartoum

编辑:由于您提供的代码输出错误,我将post 将我编写的全部代码放在这里。请 copy/paste 此代码,并提供一些反馈...

import java.util.TimeZone;

public class Answer {

    public static void main(String[] args) {

        String[] strings = TimeZone.getAvailableIDs();

        for (String s : strings) {
            if (s.contains("Khartoum")) {
                System.out.println("For " + s + " raw offset is "
                        + TimeZone.getTimeZone(s).getRawOffset());
            }
        }

    }

}

输出应该是:

For Africa/Khartoum raw offset is 7200000