由于没有详细了解Timestamp和Date之间的关系犯的错

来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/06/04 00:37

    自己最近在做的一个需求,有一个地方是需要判断时间段是否重叠的,部分代码如下:

         Date validDate = infGrPortChargingRelaVO.getValidDate();
        Date expireDate = infGrPortChargingRelaVO.getExpireDate();(infGrPortChargingRelaVO是从new 出来并赋值的对象)

         Date validDate1 = vo1.getValidDate();
         Date expireDate1 = vo1.getExpireDate();(vo1是从数据库里查到的)

        之前在对这两个时间段进行比较的时候 ,用的是这一段代码:

        if(validDate==validDate1 ||expireDate == expireDate1 ||
           (validDate.before(expireDate1)&&validDate.after(validDate1)) ||
            (expireDate.before(expireDate1)&&expireDate.after(validDate1))||
            (validDate1.before(expireDate)&&validDate1.after(validDate)) ||
            (expireDate1.before(expireDate)&&expireDate1.after(validDate))){
                System.out.println("时间段重叠");   
         }

         发现validDate==validDate1 ||expireDate == expireDate1 并不能得到正确结果

         debug发现:validDate1 其实是Timestamp类型的,而validDate是Date类型的

       

但是查询数据库是这样:
先不管,等我晚上回去查查资料看这个是为什么,先讲这个问题,然后 我打印了用“==”和“compareTo()"方法的结果,前者是false,后者是true。

         System.out.println("validDate==validDate1 "+(validDate==validDate1 ));
         System.out.println("validDate.compareTo(validDate1)==0 "+(validDate.compareTo(validDate1)==0));

然后我就去网上找了博文  知道了部分真相  地址帖种在这里:http://blog.163.com/dingyi_57@126/blog/static/11047919520107253563968/

大概就是:Timestamp类型由 java.util.Date和单独的毫微秒值组成。只有整数秒才会存储在 java.util.Date组件中。小数秒(毫微秒)是独立存在的。传递不是 java.sql.Timestamp实例的对象时,Timestamp.equals(Object)方法永远不会返回 true,因为日期的毫微秒组件是未知的,相对于 java.util.Date.equals(Object)方法而言,Timestamp.equals(Object)方法是不对称的。此外,hashcode方法使用底层java.util.Date
实现并因此在其计算中不包括毫微秒。 鉴于 Timestamp类和上述 java.util.Date类之间的不同,建议代码一般不要将 Timestamp值为 java.util.Date的实例。Timestamp和 java.util.Date之间的继承关系实际上指的是实现继承,而不是类型继承。

第一次写博文,还这么匆忙,要是有人看到的话,不对不足的地方请谅解并欢迎指正,谢谢。



         


0 0
原创粉丝点击