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

How to compare java.sql.Timestamp and java.util.Date

我知道 java 日期设计不佳,但直到今天我才知道如何。

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

我写了一个看起来很奇怪但它通过了的测试!

@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

您有 Timestamp::compareTo(java.util.Date o) in java.sql.TimeStamp class。用它。

tl;博士

originalInstant.equals( 
    org.threeten.bp.DateTimeUtils.toInstant( mySqlTimestamp ) 
) 

避免遗留日期时间类

旧的日期时间 类 与 Java 的最早版本捆绑在一起是一团糟,设计糟糕,黑客攻击笨拙。其中一个糟糕的技巧是使 java.sql.Timestamp 成为 java.util.Date 的子类,同时告诉您忽略继承这一事实。

引用the class doc(强调我的):

Due to the differences between the Timestamp class and the java.util.Date class mentioned above, it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance, and not type inheritance.

你被告知要假装他们 相关 类。所以你试图比较每种类型的对象是不合适的。

数据丢失

Timestamp 的分辨率高达 nanoseconds. The java.util.Date class is limited to milliseconds。所以两者不会比较相等。

使用java.time

而是使用 java.time 类。它们的大部分功能都可以作为 Java6 的后向端口使用——见下文。

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

InstantUTC with a resolution of nanoseconds 中时间轴上的一个时刻。

Instant instant = DateTimeUtils.toInstant( mySqlTimestamp ) ;

现在与您原来的 Instant 进行比较。

boolean isOriginal = originalInstant.equals( instant ) ;

关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time 类.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

在哪里获取java.time类?