为什么下面一行打印错误?我认为它应该打印正确。
TimeZone.getTimeZone("UTC+5:30").hasSameRules(TimeZone.getTimeZone("GMT+5:30")
答案就在TimeZone的JavaDoc#getTimeZone中:
时区的 ID,可以是缩写(如“PST”)、全名(如“America/Los_Angeles”)或自定义 ID(如“GMT-8:00”)
退货: 指定的时区,或者 GMT 时区(如果给定的 ID 无法理解)。
并且(来自类文档)
[...]自定义时区ID的语法为:
CustomID:
GMT Sign Hours : Minutes
GMT Sign Hours Minutes
GMT Sign Hours
ID
"UTC+5:30"
不是有效的时区 ID(根据方法/类的规范),并被解释为“GMT”区域,这与“GMT+5:30”区域明显不同。
由于您位于印度,您应该使用
ZoneId india = ZoneId.of("Asia/Kolkata");
两条消息:
TimeZone
类存在设计问题并且早已过时。 Calender
和SimpleDateFormat
等朋友也是如此。所以不要使用它们。请改用现代 Java 日期和时间 API java.time。它对 TimeZone
的替代是 ZoneId
类(ZoneOffset
表示与 UTC 的偏移量,但不要将其用作时区,它不是时区,请参阅下一项)。Asia/Kolkata
清楚地传达了这一点。此外,Asia/Kolkata
是面向未来的,以防政治家在某个时间点更改印度的 UTC 偏移量或引入夏令时 (DST)。虽然这对印度来说不太可能,但在世界其他地方却经常发生,因此最好养成始终使用地区/城市格式的习惯。这只是现代 API 的众多设计优势之一,它拒绝您使用的无效格式。尝试您的代码的现代版本:
ZoneId.of("UTC+5:30").getRules().equals(ZoneId.of("GMT+5:30").getRules()) // invalid formats
这会抛出:
java.time.DateTimeException: Invalid ID for offset-based ZoneId: UTC+5:30
。现在您从一开始就知道出了什么问题:UTC+5:30
不是有效的时区 ID。
链接: Oracle 教程:日期时间 解释如何使用
java.time
。