我应该使用java.util.Date还是切换到java.time.LocalDateJDBC 4.2关于 java.time

2022-08-31 09:58:29

编辑:嗯,显然它太基于意见了,所以让我试着更准确地改写它 -

在不需要任何向后兼容性的Java代码中使用LocalDate,LocalTime等是否有任何明显的警告或缺点,如果是这样 - 它们是什么?

我正在寻找诸如“当前的EE库X和Y无法与LocalDate一起正常工作”或“这个非常有用的模式被LocalTime打破”之类的东西。


(这里是原始问题供参考)

在Java 8中,引入了一个新的时间API,即java.time.LocalDate等,但java.util.Date没有被标记为已弃用。

我正在编写一个新项目,不需要向后兼容。我应该只使用LocalDate,LocalDateTime等吗?与旧的java.util.Date相比,使用此新API是否有任何缺点?

特别是 - 我将主要与JDBC合作。据我所知,JDBC很好地处理了java.util.Date。它是否适合 LocalDate?

搜索产生了许多网站,告诉他们如何从一种格式转换为另一种格式,但对于新代码是否应该使用旧API没有明确的答案。

谢谢。


答案 1

尽管有这个名字,但可以用来存储日期和时间(它存储自纪元以来的UTC毫秒偏移量)java.util.Date

我肯定会使用新的API,因为功能更强大:

  • 更简单的格式/解析。API 有自己的格式/解析方法
  • API 包括加法/减法运算(、 等)minusMinutesplusDays

以上均不适用于java.util.Date

旧日期也可以转换为如下:LocalDateTime

    Date oldDate = ...
    LocalDateTime newDateTime = 
      LocalDateTime.from(Instant.ofEpochMilli(oldDate.getTime()));

答案 2

我正在添加Ole V.V的正确答案。

JDBC 4.2

特别是 - 我将主要与JDBC合作。

JDBC 4.2 添加了对与数据库交换 java.time 对象的支持。请参见 和 方法。PreparedStatement::setObjectResultSet::getObject

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( z ) ;
myPreparedStatement.setObject( … , today ) ;

检索。

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

出于我无法理解的原因,JDBC 规范不需要支持两个最常用的类:InstantZonedDateTime。您的数据库和 JDBC 驱动程序可能会也可能不会添加对这些驱动程序的支持。

如果没有,您可以轻松转换。从 OffsetDateTime 开始,在 JDBC 中需要支持。

OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;

要通过特定区域(时区)的人员使用的挂钟时间查看此时刻,请应用 a 来获取对象。ZoneIdZonedDateTime

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant() ;

要调整为 UTC,请提取 .根据定义,An 始终采用 UTC 格式。InstantInstant

Instant instant = odt.toInstant() ;

您可以转换另一种方式,以写入数据库。

myPreparedStatement.setObject( … , zdt.toOffsetDateTime() ;  // Converting from `ZonedDateTime` to `OffsetDateTime`. Same moment, same point on the timeline, different wall-clock time.

...和:

myPreparedStatement.setObject( … , instant.atOffset( ZoneOffset.UTC ) ) ;  // Converting from `Instant` to `OffsetDateTime`. Same moment, same point on the timeline, and even the same offset. `OffsetDateTime` is a more flexible class with abilities such as (a) applying various offsets and (b) flexible formatting when generating text, while `Instant` is meant to be a more basic building-block class. 

请注意 java.time 中使用的命名约定:、 、 、 、 等。atfromtowith

Table of date-time types in Java (both modern and legacy) and in standard SQL.


关于 java.time

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

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

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

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

从哪里获取 java.time 类?

ThreeTen-Extra 项目通过其他类扩展了 java.time。这个项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuarter