为什么ZoneOffset.UTC!= ZoneId.of(“ UTC”)?

为什么

ZonedDateTime now = ZonedDateTime.now();

System.out.println(now.withZoneSameInstant(ZoneOffset.UTC)

.equals(now.withZoneSameInstant(ZoneId.of("UTC"))));

打印出来false

我希望两个ZonedDateTime实例都相等。

回答:

答案来自(强调我的)javadocZoneId

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

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

大多数固定偏移量由ZoneOffset表示。

…并且来自(强调我的)的javadocZoneId#of

此方法解析ID,产生ZoneId或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将返回truenormalized()并将返回对应的ZoneOffset

标准化时区ID,并在可能的情况下返回ZoneOffset。

now.withZoneSameInstant(ZoneOffset.UTC)

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

如文档所述,如果您使用"Z""+0"作为输入ID,of则将ZoneOffset直接返回,而无需调用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

以上是 为什么ZoneOffset.UTC!= ZoneId.of(“ UTC”)? 的全部内容, 来源链接: utcz.com/qa/432781.html

回到顶部