小编典典

ZoneOffset.UTC 和 ZoneId.of("UTC") 有什么区别?

all

为什么

ZonedDateTime now = ZonedDateTime.now();
System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));

打印出来false

我希望这两个ZonedDateTime实例是相等的。


阅读 164

收藏
2022-07-28

共1个答案

小编典典

答案来自(强调我的)的javadoc
ZoneId

ZoneId 用于标识用于在 Instant 和 LocalDateTime 之间转换的规则。有两种不同类型的 ID:

  • 固定偏移量 - 与 UTC/格林威治完全解析的偏移量,对所有本地日期时间使用相同的偏移量
  • 地理区域 - 适用于查找与 UTC/格林威治的偏移量的一组特定规则的区域

大多数固定偏移量由 ZoneOffset 表示。 对任何 ZoneId 调用 normalized() 将确保固定偏移 ID 将表示为
ZoneOffset。

…以及来自(强调我的)的javadoc
ZoneId#of

此方法解析生成 ZoneId 或 ZoneOffset 的 ID。 如果 ID 为 ‘Z’ 或以 ‘+’ 或 ‘-‘ 开头,则返回
ZoneOffset

参数 id 指定为"UTC",因此它将返回ZoneId带有偏移量的 a ,它也以字符串形式呈现:

System.out.println(now.withZoneSameInstant(ZoneOffset.UTC));
System.out.println(now.withZoneSameInstant(ZoneId.of("UTC")));

输出:

2017-03-10T08:06:28.045Z
2017-03-10T08:06:28.045Z[UTC]

当您使用该equals方法进行比较时,您会 检查对象等价性 。由于所描述的差异,评估的结果是false

当按照normalized()文档中的建议使用该方法时,使用的比较equals将返回true,也normalized()将返回相应的ZoneOffset

规范化时区 ID,尽可能返回 ZoneOffset。

now.withZoneSameInstant(ZoneOffset.UTC)
    .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true

如文档所述,如果您使用"Z"or"+0"作为输入 id,ofZoneOffset直接返回,无需调用normalized()

now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true

要检查 它们是否存储相同的日期时间
,您可以使用以下isEqual方法:

now.withZoneSameInstant(ZoneOffset.UTC)
    .isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))); // true

样本

System.out.println("equals - ZoneId.of(\"UTC\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
System.out.println("equals - ZoneId.of(\"UTC\").normalized(): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())));
System.out.println("equals - ZoneId.of(\"Z\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("Z"))));
System.out.println("equals - ZoneId.of(\"+0\"): " + nowZoneOffset
        .equals(now.withZoneSameInstant(ZoneId.of("+0"))));
System.out.println("isEqual - ZoneId.of(\"UTC\"): "+ nowZoneOffset
        .isEqual(now.withZoneSameInstant(ZoneId.of("UTC"))));

输出:

equals - ZoneId.of("UTC"): false
equals - ZoneId.of("UTC").normalized(): true
equals - ZoneId.of("Z"): true
equals - ZoneId.of("+0"): true
isEqual - ZoneId.of("UTC"): true
2022-07-28