java.sql.Timestamp比较错误?

sno*_*ndy 11 java comparison timestamp

你好,我有一个像这样的代码片段:

Date d1 = new java.sql.Timestamp(new Date().getTime());
Thread.sleep(10);
Date d2 = new java.sql.Timestamp(new Date().getTime());
System.out.println("Date1: " + d1);
System.out.println("Date2: " + d2);
System.out.println("Comparing times d1.t < d2.t: " + (d1.getTime() < d2.getTime()));
System.out.println("Comparing dates d1.before(d2): " + (d1.before(d2)));
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

Date1: 2013-03-26 11:04:01.093
Date2: 2013-03-26 11:04:01.103
Comparing times d1.t < d2.t: true
Comparing dates d1.before(d2): false
Run Code Online (Sandbox Code Playgroud)

这个java.sql.Timestamp类出了什么问题?

是的,我看到了这个:

注意:此类型是java.util.Date和单独的纳秒值的组合.只有整数秒存储在java.util.Date组件中.分数秒 - 纳米 - 是分开的.传递类型为java.util.Date的值时,Timestamp.equals(Object)方法永远不会返回true,因为日期的nanos组件未知.因此,Timestamp.equals(Object)方法与java.util.Date.equals(Object)方法不对称.此外,哈希码方法使用底层的java.util.Date实现,因此在其计算中不包括nanos.

由于Timestamp类和上面提到的java.util.Date类之间存在差异,因此建议代码不要将Timestamp值一般视为java.util.Date的实例.Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承.

但它是Date < - > Timestamp关系.

在我的例子中,我只有Timestamps,但行为仍然是意外的..

更新:答案

发生这种情况的原因是before()方法过载,而不是覆盖java.sql.Timestamp.我期待'覆盖'行为.比较时间戳的正确方法是使用Timestamp变量,而不是Dates.

这在Java核心中仍然是一个糟糕的设计决策,因为继承应该意味着Timestamp是一个Date,没有惩罚和例外.

Ale*_*lex 3

尝试使用Timestamp代替Date,它会起作用。

Timestamp d1 = new java.sql.Timestamp(new Date().getTime());
Run Code Online (Sandbox Code Playgroud)

Timestamp并且Date都有自己的方法实现before。核实。