GMT id如何在Java时区中工作



我目前正在使用不同的时区,使用java.util.TimeZone。我做的第一件事是使用TimeZone.getAvailableIDs();

获取TimeZone id列表

它返回一堆Etc/GMT id,例如

Etc/GMT
Etc/GMT+0
Etc/GMT+1

TimeZone的Javadoc说使用"例如,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');

显示输出

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,反之亦然?

Etc/GMT...时区主要是为了与POSIX标准向后兼容,POSIX标准指定GMT的正偏移量西,而不是您可能习惯的GMT的典型约定

在大多数情况下,不应该使用它们。例如,如果您在美国太平洋时区,则应该使用标识符America/Los_Angeles。它在冬季使用UTC-8作为标准时间,在夏季使用UTC-7作为夏令时。你不应该只使用Etc/GMT+8,因为这不会考虑到夏令时。

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

别忘了把符号倒过来。Etc/GMT+3 = UTC-3

额外的阅读:

  • IANA/Olson时区数据等文件中的注释
  • 时区标签wiki
  • 维基百科关于航海时间的文章

相关内容

  • 没有找到相关文章

最新更新