我目前正在使用java.util.TimeZone
处理不同的时区。
我做的第一件事是使用TimeZone.getAvailableIDs();
它返回了一堆Etc/GMT
个ID,例如
Etc/GMT
Etc/GMT+0
Etc/GMT+1
Javadoc for TimeZone表示要使用“例如,GMT+10
和GMT+0010
”
为了确保我使用的是正确的,我用两个ID做了一个小测试,结果与我的预期不符:
String id = "GMT-1";
Calendar c = Calendar.getInstance(TimeZone.getTimeZone(id));
System.out.println(id + '\n' + c.getTimeZone().getDisplayName() + " HOUR_OF_DAY " + c.get(Calendar.HOUR_OF_DAY) + '\n');
id = "GMT+1";
c = Calendar.getInstance(TimeZone.getTimeZone(id));
System.out.println(id + '\n' + c.getTimeZone().getDisplayName() + " HOUR_OF_DAY " + c.get(Calendar.HOUR_OF_DAY) + '\n');
id = "Etc/GMT-1";
c = Calendar.getInstance(TimeZone.getTimeZone(id));
System.out.println(id + '\n' + c.getTimeZone().getDisplayName() + " HOUR_OF_DAY " + c.get(Calendar.HOUR_OF_DAY) + '\n');
id = "Etc/GMT+1";
c = Calendar.getInstance(TimeZone.getTimeZone(id));
System.out.println(id + '\n' + c.getTimeZone().getDisplayName() + " HOUR_OF_DAY " + c.get(Calendar.HOUR_OF_DAY) + '\n');
显示输出
GMT-1
GMT-01:00 HOUR_OF_DAY 18
GMT+1
GMT+01:00 HOUR_OF_DAY 20
Etc/GMT-1
GMT+01:00 HOUR_OF_DAY 20
Etc/GMT+1
GMT-01:00 HOUR_OF_DAY 18
所以我的问题是:这些Etc/GMT
ID是什么?当我使用+ X时他们为什么会给我-X,反之亦然?
答案 0 :(得分:6)
Etc/GMT...
时区主要是为了向后兼容POSIX标准,它指定了GMT的正偏移 west ,而不是GMT的典型约定 east 你可能习惯了。
在大多数情况下,您不应该使用它们。例如,如果您位于美国太平洋时区,则应使用标识符America/Los_Angeles
。它在UTC-8之间在冬季标准时间和UTC-7在夏季的白天时间之间交替。您不应该只使用Etc/GMT+8
,因为这不会占用夏令时。
除了向后兼容性之外,这些固定偏移区域发挥作用的另一个区域是出于航海目的。海上船只对他们如何设定时间有很多控制权,但他们通常使用经度为15度的固定偏移量。大西洋上的一艘船使用Etc/GMT+3
的时区设置标识符是完全可以接受的。
不要忘记倒置标志。 Etc/GMT+3
= UTC-3
补充阅读: