如何比较java.sql.Timestamp和java.util.Date

Eri*_*ric 3 java mysql date java-6 sql-timestamp

我知道java Date的设计很差,但是直到今天我都不知道。

我将日期保存到数据库中,当我从数据库中获取日期并与原始日期进行比较时,它告诉我这是不同的!

我写了一个看起来很奇怪但合格的测试!

@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());
}
Run Code Online (Sandbox Code Playgroud)

我注意到java.sql.Timestamp与Date稍有不同,我不在乎。

谁能告诉我如何比较这两种最佳做法?我不想在任何地方都比较日期使用getTime()的情况,是否有任何通用库或其他方法可以做到这一点?

顺便说一句,我正在使用JDK 6

Bas*_*que 6

tl; dr

originalInstant.equals( 
    org.threeten.bp.DateTimeUtils.toInstant( mySqlTimestamp ) 
) 
Run Code Online (Sandbox Code Playgroud)

避免使用旧的日期时间类

与最早的Java版本捆绑在一起的旧的日期时间类真是一团糟,糟糕的设计和笨拙的hacks。那些不好的hack之一是在使您忽略继承这一事实的同时创建java.sql.Timestamp的子类java.util.Date

引用班级文档(重点是我的):

由于上述Timestamp类和java.util.Date类之间的差异,建议代码不要将java.util.Date的实例一般地查看Timestamp值。Timestamp和java.util.Date之间的继承关系实际上表示实现继承,而不是类型继承。

有人告诉您假装它们不是相关课程。因此,您尝试比较每种类型的对象是不合适的。

资料遗失

Timestamp拥有分辨率高达纳秒。该java.util.Date级限制为毫秒。因此,两者将不会相等。

使用java.time

而是使用java.time类。它们的许多功能可作为Java 6的后备端口使用-参见下文。

当您获得时Timestamp,请立即转换为java.time类型。在Java 8和更高版本中,您可以调用添加到这些旧类中的新方法进行转换。在Java 6和7的ThreeTen-Backport库中,使用org.threeten.bp.DateTimeUtils.toInstant( Timestamp )

一个Instant是在时间轴上的一个时刻UTC,分辨率为纳秒

Instant instant = DateTimeUtils.toInstant( mySqlTimestamp ) ;
Run Code Online (Sandbox Code Playgroud)

现在与您的原始图片进行比较Instant

boolean isOriginal = originalInstant.equals( instant ) ;
Run Code Online (Sandbox Code Playgroud)

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.DateCalendar,和SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

在哪里获取java.time类?