java 8 - ZonedDateTime 不等于另一个 ZonedDateTime

标签 java java-8 java-time

我创建了两个 ZonedDateTime 对象,我认为它们应该相等:

public static void main(String[] args) {
    ZoneId zid = ZoneId.of("America/New_York");
    ZoneOffset offset = ZoneOffset.from(LocalDateTime.now().atZone(zid));
    ZonedDateTime zdt0 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, offset);
    ZonedDateTime zdt1 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, zid);
    boolean equals = Objects.equals(zdt0, zdt1);
    System.out.println("equals: " + equals);
}

在调试器中,我看到 ZonedDateTime zone 的成员类在第一种情况下是 java.time.ZoneOffset ,在第二种情况下是 java.time.ZoneRegion 并且这使得 ZonedDateTime对象不相等。这令人困惑... 有什么想法吗?

最佳答案

您正在检查计算结果为 false 的对象相等性,因为这些对象不相等。一个绑定(bind)到 ZoneId,另一个绑定(bind)到 ZoneOffset。如果要检查它们是否表示相同的时间,可以使用命名不太直观的方法isEqual

例如:

ZoneId zid = ZoneId.of("America/New_York");
ZoneOffset offset = ZoneOffset.from(LocalDateTime.now().atZone(zid));
ZonedDateTime zdt0 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, offset);
ZonedDateTime zdt1 = ZonedDateTime.of(2014, 8, 24, 21, 10, 1, 777000002, zid);
System.out.println("isEqual:" + zdt0.isEqual(zdt1));
System.out.println("equals: " + zdt0.equals(zdt1));

打印:

isEqual:true
equals: false

顺便说一句,请注意您不需要对两个已知为非null 的对象使用Objects.equals(a,b)。您可以直接调用 a.equals(b)

关于java 8 - ZonedDateTime 不等于另一个 ZonedDateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793628/

相关文章:

java - 在 JDialog 中丢失鼠标单击功能

Java 类 : Anonymous vs Nested vs Private

Java 8 : Difference between two LocalDateTime in multiple units

java - 如何序列化一个lambda?

hibernate Java 8 ZonedDateTime

java - LocalDateTime isAfter 和 isBefore 配置时间

java - 日期作为 LocalDateTime 的长值

java - 如何将 LocalDate 转换为 Instant?

java - 流式传输远程日志文件的有效方法

Java If 语句简写形式