我创建了两个 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/