GMT ID如何在Java TimeZone中运行?

Sek*_*uar 1 java timezone

我目前正在使用不同的时区java.util.TimeZone.我做的第一件事是使用获取TimeZone ID的列表TimeZone.getAvailableIDs();

它返回了一堆Etc/GMTID,例如

Etc/GMT
Etc/GMT+0
Etc/GMT+1
Run Code Online (Sandbox Code Playgroud)

TimeZoneJavadoc说使用"例如,GMT+10GMT+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');
Run Code Online (Sandbox Code Playgroud)

显示输出

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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这些Etc/GMTID是什么?当我使用+ X时他们为什么会给我-X,反之亦然?

Mat*_*int 6

Etc/GMT...时区存在主要是为了与POSIX标准的后向兼容性,这指定正偏移以西 GMT,而不是典型的约定格林尼治标准时间的,你可能会使用到.

在大多数情况下,您不应该使用它们.例如,如果您位于美国太平洋时区,则应使用标识符America/Los_Angeles.它在UTC-8之间在冬季标准时间和UTC-7在夏季的白天时间之间交替.你不应该只是使用Etc/GMT+8,因为这不会考虑夏令时.

除了向后兼容性之外,这些固定偏移区域发挥作用的另一个区域是出于航海目的.海上船只对他们如何设定时间有很多控制权,但他们通常使用经度为15度的固定偏移量.对于大西洋中的船舶来说,使用时区设置标识符是完全可以接受的Etc/GMT+3.

只是不要忘记反转标志. Etc/GMT+3= UTC-3

补充阅读: