为什么GMT和UTC时区没有相同的规则

时间:2018-11-16 05:19:35

标签: java timezone

为什么下面一行打印错误?我认为它应该打印正确。

TimeZone.getTimeZone("UTC+5:30").hasSameRules(TimeZone.getTimeZone("GMT+5:30")

2 个答案:

答案 0 :(得分:8)

答案在JavaDoc of TimeZone#getTimeZone中:

  

TimeZone的ID,缩写为“ PST”,全名为“ America / Los_Angeles”,或者为自定义ID,例如“ GMT-8:00”

     

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

然后(来自class documentation

  

[...]自定义时区ID的语法为:

  CustomID:
     GMT Sign Hours : Minutes
     GMT Sign Hours Minutes
     GMT Sign Hours

ID "UTC+5:30"不是有效的TimeZone ID(根据方法/类的规范),并被解释为“ GMT”区域,该区域明显不同于“ GMT + 5:30”区域

答案 1 :(得分:3)

既然您位于印度,就应该使用

    ZoneId india = ZoneId.of("Asia/Kolkata");

两条消息:

  1. TimeZone类存在设计问题,并且已经过时了。像CalenderSimpleDateFormat这样的朋友也是如此。所以不要使用它们。而是使用现代Java日期和时间API java.time。它用TimeZone类代替ZoneId(用ZoneOffset代替UTC,但不要用它作为时区,它不是一个时区,请参阅下一项)。
  2. 请勿将UTC或GMT的偏移量用作时区。当然,它在您的特定情况下有效,但可能会让读者感到疑惑,为什么选择Asia/Kolkata清楚地说明了+05:30。此外,Asia/Kolkata面向未来,以防政客在某个时间更改印度的UTC时差或引入夏令时(DST)。尽管这在印度不太可能发生,但它在世界其他地方一直都在发生,因此最好养成始终使用 region / city 格式的习惯。

对于现代API的众多设计优势之一,请尝试代码的现代版本:

    ZoneId.of("UTC+5:30").getRules().equals(ZoneId.of("GMT+5:30").getRules())

抛出:java.time.DateTimeException: Invalid ID for offset-based ZoneId: UTC+5:30。现在,您从一开始就知道出了什么问题:UTC+5:30不是有效的时区ID。

链接: Oracle tutorial: Date Time解释了如何使用java.time