为什么喀土穆的偏移量为 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
为什么会出现下面的代码:
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