栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java中将Date对象与TimeStamp进行比较

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中将Date对象与TimeStamp进行比较

tl; dr

使用现代的 java.time 类,而不要使用那些麻烦的旧式日期时间类。

myPreparedStatement.setObject(    … ,     Instant.now()     // Capture the current moment in UTC.)

设计不好的旧日期时间类

坦率地说,java.sql.Timestamp / .Date /
.Time类是一个hack,一个糟糕的hack。像java.util.Date/.Calendar一样,它们是错误的设计选择的结果。

应该尽可能简短地使用java.sql类型,仅用于将数据移入/移出数据库。请勿用于业务逻辑和进一步的工作。

java.time

旧的日期时间类已被内置在Java
8及更高版本中的java.time框架取代。这些新类由JSR 310定义,其灵感来自于非常成功的Joda-Time库,并由ThreeTen-Extra项目扩展。

最终,我们应该看到JDBC驱动程序已更新,可以直接与这些java.time类型一起使用。但是直到那一天,我们需要转换为java.sql类型或从java.sql类型转换为。对于此类转换,请调用添加到旧类中的新方法。

一个

Instant
是UTC时间线的分辨率了一下纳秒。

Instant instant = myJavaSqlTimestamp.toInstant();

要走另一个方向:

java.sql.Timestamp ts = java.sql.Timestamp.valueOf( instant );

应用一个时区以获得壁钟时间。

ZoneId zoneId = ZoneId.of( "America/Montreal" );ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

java.time类具有简洁明智的类设计。因此您可以按预期使用

equals
compareTo
。需要注意的是有偏移的,UTC或时区的班还提供
isEqual
isBefore
isAfter
方法。这些方法通过考虑时间轴上的时刻及其时间顺序进行比较。该
equals
compareTo
方法也考虑偏移或时区。

最小化java.sql的使用,同时最大化java.time的使用,使问题的讨论变得毫无意义。

在Hibernate中,将转换器用于java.time。

JDBC 4.2

从JDBC 4.2和更高版本开始,您根本不需要使用旧类。您可以通过&方法直接与数据库交换 java.time
对象。

getObject``setObject

myPreparedStatement.setObject( … , instant ) ;

和检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

注意,许多数据库无法存储分辨率与 java.time中 使用的纳秒一样精细的 时刻
。您可能想要显式截断而不是让JDBC驱动程序隐式截断。

Instant instant = Instant.now().truncatedTo( ChronoUnit.MILLIS ) ; // Lop off any nanoseconds & microseconds, keeping only the milliseconds, to match limitations of database.

关于 java.time

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

java.util.Date
Calendar
,和
SimpleDateFormat

现在处于维护模式的 Joda-
Time

项目建议迁移到java.time类。

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

您可以直接与数据库交换 java.time 对象。使用与JDBC
4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要类。

java.sql.*

在哪里获取java.time类?

  • Java SE 8Java SE 9Java SE 10 和更高版本
    • 内置的
    • 标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
    • java.time的许多功能在 ThreeTen- Backport中都被反向移植到Java 6和7 。
  • 安卓系统
    • 更高版本的Android捆绑了java.time类的实现。
    • 对于早期的Android(<26), ThreeTenABP 项目改编了 ThreeTen-Backport (如上所述)。请参阅 如何使用ThreeTenABP…

ThreeTen-额外
项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如

Interval
YearWeek
YearQuarter
,和更多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/463623.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号