你好,我有一个这样的代码片段:
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核心中仍然是一个糟糕的设计决策,因为继承 意味着时间戳是一个日期,没有惩罚和例外..
答案 0 :(得分:3)
嗯,这似乎是一个记录不足的特征。
before
的{{1}}和after
方法似乎与第二种方法进行比较,但没有考虑毫秒部分。尝试运行它,直到Timestamp
落入不同的秒数并且比较按预期工作(将睡眠增加到500以使其更容易)。
顺便说一句,TimeStamp
方法考虑了毫秒,所以你可以改用它。
答案 1 :(得分:2)
尝试使用Timestamp
代替Date
,它会起作用。
Timestamp d1 = new java.sql.Timestamp(new Date().getTime());
Timestamp
和Date
都有自己的方法before
的实现。检查一下。
答案 2 :(得分:1)
如果您调用方法Timestamp.before(Timestamp)
,您将获得预期结果。
但显然使用Timestamp
作为Date
将是一个混乱。您必须Timestamp
使用Timestamp
静态。
答案 3 :(得分:0)