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
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 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 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
| 归档时间: |
|
| 查看次数: |
2865 次 |
| 最近记录: |