为什么下面一行打印错误?我认为它应该打印正确。
TimeZone.getTimeZone("UTC+5:30").hasSameRules(TimeZone.getTimeZone("GMT+5:30")
答案 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");
两条消息:
TimeZone
类存在设计问题,并且已经过时了。像Calender
和SimpleDateFormat
这样的朋友也是如此。所以不要使用它们。而是使用现代Java日期和时间API java.time。它用TimeZone
类代替ZoneId
(用ZoneOffset
代替UTC,但不要用它作为时区,它不是一个时区,请参阅下一项)。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
。