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

时间:2018-06-13 14:03:38

标签: java timezone timezone-offset

为什么以下代码:

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(与#34; Cairo相同)#。

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

3 个答案:

答案 0 :(得分:3)

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

Africa/Khartoum

否则旧的Timezone-API将回归到GMT。

答案 1 :(得分:1)

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

TimeZone.getTimeZone(String)的javadoc说

  

返回:      指定的TimeZone,如果无法理解给定ID,则 GMT区域

更多

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

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

它返回7200000(至少在我尝试时)。

答案 2 :(得分:0)

如果你怀疑还有另一个“喀土穆”,例如“亚洲/喀土穆”, 你可以编写代码来清除所有的疑惑:

String[] strings = TimeZone.getAvailableIDs();

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

输出(即使在Java 10中)

  

非洲/喀土穆

编辑:由于您提供的代码输出错误,我将在此处发布我编写的完整代码。请复制/粘贴此代码,并显示一些反馈......

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());
            }
        }

    }

}

输出应为:

  

非洲/喀土穆的原始抵消额为7200000