为什么
ZonedDateTime now = ZonedDateTime.now(); System.out.println(now.withZoneSameInstant(ZoneOffset.UTC) .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
打印出来false?
false
我希望这两个ZonedDateTime实例是相等的。
ZonedDateTime
答案来自(强调我的)的javadoc …ZoneId
ZoneId
ZoneId 用于标识用于在 Instant 和 LocalDateTime 之间转换的规则。有两种不同类型的 ID: 固定偏移量 - 与 UTC/格林威治完全解析的偏移量,对所有本地日期时间使用相同的偏移量 地理区域 - 适用于查找与 UTC/格林威治的偏移量的一组特定规则的区域 大多数固定偏移量由 ZoneOffset 表示。 对任何 ZoneId 调用 normalized() 将确保固定偏移 ID 将表示为 ZoneOffset。
ZoneId 用于标识用于在 Instant 和 LocalDateTime 之间转换的规则。有两种不同类型的 ID:
大多数固定偏移量由 ZoneOffset 表示。 对任何 ZoneId 调用 normalized() 将确保固定偏移 ID 将表示为 ZoneOffset。
…以及来自(强调我的)的javadoc :ZoneId#of
ZoneId#of
此方法解析生成 ZoneId 或 ZoneOffset 的 ID。 如果 ID 为 ‘Z’ 或以 ‘+’ 或 ‘-‘ 开头,则返回 ZoneOffset 。
参数 id 指定为"UTC",因此它将返回ZoneId带有偏移量的 a ,它也以字符串形式呈现:
"UTC"
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。
equals
当按照normalized()文档中的建议使用该方法时,使用的比较equals将返回true,也normalized()将返回相应的ZoneOffset:
normalized()
true
ZoneOffset
规范化时区 ID,尽可能返回 ZoneOffset。
now.withZoneSameInstant(ZoneOffset.UTC) .equals(now.withZoneSameInstant(ZoneId.of("UTC").normalized())); // true
如文档所述,如果您使用"Z"or"+0"作为输入 id,of将ZoneOffset直接返回,无需调用normalized():
"Z"
"+0"
of
now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("Z"))); //true now.withZoneSameInstant(ZoneOffset.UTC).equals(now.withZoneSameInstant(ZoneId.of("+0"))); //true
要检查 它们是否存储相同的日期时间 ,您可以使用以下isEqual方法:
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