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

问题描述 投票:0回答:2

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

TimeZone.getTimeZone("UTC+5:30").hasSameRules(TimeZone.getTimeZone("GMT+5:30")
java timezone
2个回答
8
投票

答案就在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”区域明显不同。


3
投票

由于您位于印度,您应该使用

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

两条消息:

  1. TimeZone
    类存在设计问题并且早已过时。
    Calender
    SimpleDateFormat
    等朋友也是如此。所以不要使用它们。请改用现代 Java 日期和时间 API java.time。它对
    TimeZone
    的替代是
    ZoneId
    类(
    ZoneOffset
    表示与 UTC 的偏移量,但不要将其用作时区,它不是时区,请参阅下一项)。
  2. 请勿使用 UTC 或 GMT 的偏移量作为时区。当然,它适用于您的特定情况,但可能会让读者想知道为什么您选择 +05:30,这
    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

© www.soinside.com 2019 - 2024. All rights reserved.