繁体   English   中英

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

[英]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

TL;博士

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.time类。 它们的大部分功能都可以作为Java 6的后端 - 见下文。

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

InstantUTC时间轴上的一个时刻,分辨率为纳秒

Instant instant = DateTimeUtils.toInstant( mySqlTimestamp ) ;

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

boolean isOriginal = originalInstant.equals( instant ) ;

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

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

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310

从哪里获取java.time类?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM