在 Java 中将 Date 对象与时间戳进行比较tl;博士旧的日期时间类设计不佳java.time关于 java.time
当我测试此代码时:
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));
我会期待一个真,真,真,假。因此:
在 javadoc for java.sql.Timestamp 中,它指出:
注意:此类型是 java.util.Date 和单独的纳秒值的组合。只有整数秒存储在 java.util.Date 组件中。秒的小数部分 - 纳米 - 是分开的。Timestamp.equals(Object) 方法在传递 java.util.Date 类型的值时永远不会返回 true,因为日期的 nanos 分量是未知的。因此,Timestamp.equals(Object) 方法相对于 java.util.Date.equals(Object) 方法不是对称的。此外,哈希码方法使用底层java.util.Date实现,因此在其计算中不包括nanos。
由于上面提到的 Timestamp 类和 java.util.Date 类之间存在差异,因此建议代码不要将时间戳值通常视为 java.util.Date 的实例。Timestamp 和 java.util.Date 之间的继承关系实际上表示实现继承,而不是类型继承。
但相反,我会得到一个真,假,真,假。有什么想法吗?
编辑:当我使用 equals 方法检查两个 Dates 时,会出现此问题,但其中一个 Date 对象来自 Hibernate 类和调试,我看到该对象包含一个 TimeStamp。所以等式方法的计算结果为false,然后我发现这个:http://mattfleming.com/node/141
但是当我尝试代码时,我得到不同的结果...如果我不能使用两个等于和compareTo,我应该用什么来检查2个日期是否相同?!?!