为什么
ZonedDateTime now = ZonedDateTime.now(); System.out.println(now.withZoneSameInstant(ZoneOffset.UTC) .equals(now.withZoneSameInstant(ZoneId.of("UTC"))));
打印出来false?
false
我希望两个ZonedDateTime实例都相等。
ZonedDateTime
答案来自(强调我的)javadocZoneId …
ZoneId
ZoneId用于标识用于在Instant和LocalDateTime之间进行转换的规则。有两种不同的ID类型: 固定偏移量-与UTC /格林威治标准时间完全抵消的偏移量,所有本地日期时间都使用相同的偏移量 地理区域-适用于从UTC /格林威治中查找偏移量的一组特定规则的区域 大多数固定偏移量由ZoneOffset表示。 在任何ZoneId上调用normalized()将确保将固定的偏移量ID表示为ZoneOffset。
ZoneId用于标识用于在Instant和LocalDateTime之间进行转换的规则。有两种不同的ID类型:
大多数固定偏移量由ZoneOffset表示。 在任何ZoneId上调用normalized()将确保将固定的偏移量ID表示为ZoneOffset。
…并且来自(强调我的)的javadocZoneId#of:
ZoneId#of
此方法解析ID,产生ZoneId或ZoneOffset。 如果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"或"+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