java.sql.Timestamp比较错误?

时间:2013-03-26 04:07:43

标签: 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)));

输出如下:

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

这个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)方法不对称。此外,hashcode方法使用底层的java.util.Date实现,因此在计算中不包含nanos。

     

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

但它适用于Date&lt; - &gt;时间戳关系。

在我的示例中,我只有Timestamps,但行为仍然是意料之外的。

更新:答案

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

这在Java核心中仍然是一个糟糕的设计决策,因为继承 意味着时间戳是一个日期,没有惩罚和例外..

4 个答案:

答案 0 :(得分:3)

嗯,这似乎是一个记录不足的特征。

before的{​​{1}}和after方法似乎与第二种方法进行比较,但没有考虑毫秒部分。尝试运行它,直到Timestamp落入不同的秒数并且比较按预期工作(将睡眠增加到500以使其更容易)。

顺便说一句,TimeStamp方法考虑了毫秒,所以你可以改用它。

答案 1 :(得分:2)

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

Timestamp d1 = new java.sql.Timestamp(new Date().getTime());

TimestampDate都有自己的方法before的实现。检查一下。

答案 2 :(得分:1)

如果您调用方法Timestamp.before(Timestamp),您将获得预期结果。

但显然使用Timestamp作为Date将是一个混乱。您必须Timestamp使用Timestamp 静态

答案 3 :(得分:0)

如上所述

timestamp is a thin wrapper

时间戳只是添加了保存SQL TIMESTAMP小数秒值的能力(在你的情况下出现问题的精度为纳秒)