我从Oracle数据库中提取日期。它们设置在java.util.Date字段上,它们实际上是java.sql.Timestamp实例(它是Java.util.Date的子类)。如果我通过在第一个日期调用after()并将它与第二个日期进行比较来比较两个不同数据库记录中的两个时间戳,那么当日期的所有部分除了毫秒之外的所有部分都相同时,我得到错误的答案。
以下所有内容都应导致“true”,但第二组数字不会:
firstDate = 1/1/2000 12:00:20:00
secondDate = 1/1/2000 12:00:10:00
result = firstDate.after(secondDate);
result is TRUE <-- EXPECTED RESULT
firstDate = 1/1/2000 12:00:00:10
secondDate = 1/1/2000 12:00:00:00
result = firstDate.after(secondDate);
result is FALSE <-- NOT EXPECTED, result should be TRUE
我知道nanos与Timestamp类中的Date实例分开存储,我很好奇这是否是问题。
答案 0 :(得分:4)
您可以比较它们,但只能通过比较毫秒。虽然它非常丑陋,但它似乎适用于所有情况(无论是java.sql.Timestamp
还是java.util.Date
)。
if(date1.getTime() > date2.getTime()) {
//...
}
答案 1 :(得分:2)
此处问题的关键是将时间戳转换为Date对象。正在使用Date的 方法而不是Timestamp中的 after 方法。如果未转换为Date,则Timestamp的 after 方法将正常工作。
我想我现在需要在covariant method parameters上学习为什么在以下代码中没有调用Timestamp中的 after 方法。
java.sql.Timestamp one = new java.sql.Timestamp(1266873627200L);
java.sql.Timestamp two = new java.sql.Timestamp(1266873627000L);
java.util.Date oneDate = (java.util.Date) one;
java.util.Date twoDate = (java.util.Date) two;
System.out.println("one: " + oneDate.getTime());
System.out.println("two: " + twoDate.getTime());
if (oneDate.after(twoDate)) {
System.out.println(oneDate.getTime() + " after " + twoDate.getTime());
} else {
System.out.println(twoDate.getTime() + " after " + oneDate.getTime());
}
结果
one: 1266873627200
two: 1266873627000
1266873627000 after 1266873627200
答案 2 :(得分:0)
看起来您遇到的问题是firstDate和secondDate设置为Java.util.Date对象,但java.sql.Timestamp的JavaDoc提到它是java.util.Date的组合并且是单独的纳秒值。
这就是为什么当你试图比较两者时它返回false。如果您将firstDate和secondDate更改为实际的Timestamp对象,则应该可以使用它们。
答案 3 :(得分:0)
如果没有实际代码,这是一种推测,但我认为您的某个对象是java.util.Date
而另一个是java.sql.Timestamp
,您无法真正比较它们,因为millis
字段位于'时间戳'被截断为秒,其余部分存储在nanos
字段中。非常遗憾Timestamp
是Date
的子类。这肯定会导致您遇到的问题。
修改强>
另一种可能性是,您的数据库驱动程序返回其自己的Timestamp
子类。因为这个类不是最终的,所以很可能他们的实现搞砸了Timestamp的compare
,而不是特别难以做到。