[英]How to compare objects with a Date variable (Hibernate)? java.util.Date vs java.sql.Timestamp
[英]How to compare java.sql.Timestamp and java.util.Date
我知道java Date的设计很差,但直到今天我才知道。
我在DB上保存了一个日期,当我从DB获取它并与原始日期进行比较时,它告诉我它与众不同!
我写了一个看起来很奇怪的测试,但它已经过去了!
@Test
public void date_equals() {
Date now = new Date();
Timestamp timestamp = new Timestamp(now.getTime());
assertFalse(timestamp.equals(now));
assertTrue(now.equals(timestamp));
assertTrue(timestamp.compareTo(now) == 0);
assertFalse(now.compareTo(timestamp) == 0);
assertTrue(timestamp.getTime() == now.getTime());
assertTrue(now.getTime() == timestamp.getTime());
}
我注意到java.sql.Timestamp与Date有一点不同,我不在乎纳秒。
谁能告诉我如何在最佳实践中比较这两个? 我不想比较日期使用getTime()无处不在,是否有任何常见的库或其他方法来做到这一点?
顺便说一下,我正在使用JDK 6
originalInstant.equals(
org.threeten.bp.DateTimeUtils.toInstant( mySqlTimestamp )
)
与最早版本的Java捆绑在一起的旧日期时间类是一个糟糕的混乱,设计不佳和笨拙的黑客。 其中一个糟糕的黑客是让java.sql.Timestamp
成为java.util.Date
的子类,同时告诉你忽略这个继承的事实。
引用课程文档 (强调我的):
由于Timestamp类和上面提到的java.util.Date类之间存在差异,因此建议代码不要将Timestamp值一般视为java.util.Date的实例 。 Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。
你被告知假装他们不是相关课程。 因此,您尝试比较每种类型的对象是不合适的。
Timestamp
的分辨率高达纳秒 。 java.util.Date
类限制为毫秒 。 所以这两者不会相等。
而是使用java.time类。 它们的大部分功能都可以作为Java 6的后端 - 见下文。
获取Timestamp
,立即转换为java.time类型。 在Java 8及更高版本中,您可以调用添加到旧类中的新方法进行转换。 在Java 6和7的ThreeTen-Backport库中,使用org.threeten.bp.DateTimeUtils.toInstant( Timestamp )
Instant instant = DateTimeUtils.toInstant( mySqlTimestamp ) ;
现在与您原来的Instant
进行比较。
boolean isOriginal = originalInstant.equals( instant ) ;
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.