gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 07:51:05 25 4
gpt4 key购买 nike

我知道 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());
}

我注意到 java.sql.Timestamp 与 Date 在纳秒方面有一点不同,我不在乎。

谁能告诉我如何在最佳实践中比较这两者?我不想到处比较日期使用 getTime(),是否有任何通用库或其他方法可以做到这一点?

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

最佳答案

tl;dr

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.

你被告知假装它们是相关的类。因此,您尝试比较每种类型的对象是不合适的。

数据丢失

时间戳 的分辨率高达 nanoseconds . java.util.Date 类限制为 milliseconds .所以两者不会比较相等。

使用java.time

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

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

InstantUTC 中时间轴上的一个时刻分辨率为 nanoseconds .

Instant instant = DateTimeUtils.toInstant( mySqlTimestamp ) ;

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

boolean isOriginal = originalInstant.equals( instant ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获得 java.time 类?

关于java - 如何比较 java.sql.Timestamp 和 java.util.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43882935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com