java 8 – ZonedDateTime不等于另一个ZonedDateTime

我创建了两个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,zid);
    boolean equals = Objects.equals(zdt0,zdt1);
    System.out.println("equals: " + equals);
}

在调试器中,我看到第一种情况下zoneddatetime区域的成员类是java.time.ZoneOffset,第二种情况是java.time.ZoneRegion,这使得zoneddatetime对象不相等.这令人困惑……
有任何想法吗?

解决方法

您正在检查对象相等性,其值为false,因为这些对象不相等.一个绑定到ZoneId,另一个绑定到ZoneOffset.如果要检查它们是否代表同一时间,则可以使用非常直观命名的方法isEqual.

例如.:

ZoneId zid = ZoneId.of("America/New_York");
ZoneOffset offset = ZoneOffset.from(LocalDateTime.Now().atZone(zid));
zoneddatetime zdt0 = zoneddatetime.of(2014,offset);
zoneddatetime zdt1 = zoneddatetime.of(2014,zid);
System.out.println("isEqual:" + zdt0.isEqual(zdt1));
System.out.println("equals: " + zdt0.equals(zdt1));

打印:

isEqual:true
equals: false

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...