当我测试这段代码时:
java.util.Date date = new java.util.Date();
java.util.Date stamp = new java.sql.Timestamp(date.getTime());
assertTrue(date.equals(stamp));
assertTrue(date.compareTo(stamp) == 0);
assertTrue(stamp.compareTo(date) == 0);
assertTrue(stamp.equals(date));
我期望得到一个 true、true、true、false。原因如下:在 java.sql.Timestamp 的 javadoc 中,注明了以下内容:
注意:这种类型是一个 java.util.Date 和一个单独的纳秒值的组合。只有整数秒存储在 java.util.Date 组件中。小数秒 - 纳秒 - 是分开的。当传递 java.util.Date 类型的值时,Timestamp.equals(Object) 方法永远不会返回 true,因为日期的纳秒组件是未知的。因此,Timestamp.equals(Object) 方法在与 java.util.Date.equals(Object) 方法相比中不对称。此外,hashcode 方法使用基础的 java.util.Date 实现,因此在计算中不包括纳秒。
由于以上提到的 Timestamp 类和 java.util.Date 类之间的差异,建议代码不将 Timestamp 值通用地视为 java.util.Date 的实例。Timestamp 与 java.util.Date 之间的继承关系实际上表示实现继承,而不是类型继承。
但实际上我会得到 true、false、true、false。你有什么想法吗?
编辑:我使用 equals 方法检查两个日期时出现了问题,但其中一个 Date 对象来自 Hibernate 类,并且调试时我发现对象包含一个 TimeStamp。因此 equals 方法的结果为 false,然后我找到了这个链接:http://mattfleming.com/node/141 但是,当我尝试运行代码时得到的结果不同...如果不能使用 equals 和 compareTo 方法,那么我应该使用什么方法来检查 2 个日期是否相同?!?
Timestamp
的实现很愚蠢,你应该将这两个类视为没有关联,就像编写它的人的意图一样。 - Viruzzo