gpt4 book ai didi

java - 在java.util.Date或java.sql.Date之间进行选择

转载 作者:行者123 更新时间:2023-12-03 02:12:20 25 4
gpt4 key购买 nike

我应该使用java.util.Date还是java.sql.Date?

我有一个VisualFox数据库,并且已使用IntelliJ Idea向导使用适当的jdbc type 4驱动程序检索了实体。

ide(或驱动程序)已将日期字段创建为Timestamp。但是,日期字段不是时间戳而是日期字段,它们仅存储年,月和日。

所以我想知道是否应该切换到java.util.Date或java.sql.Date。乍一看,我认为java.sql.Date应该是适当的,但是它有许多方法被声明为不推荐使用。

最佳答案

tl; dr

Should I use java.util.Date or java.sql.Date?



都不行

JDBC 4.2及更高版本开始,两者都已过时。请改用java.time类。
  • 仅日期值对于类似于SQL标准DATE的数据库类型,请使用java.time.LocalDate
  • LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
  • myPreparedStatement.setObject( ld , … ) ;
  • 日期,以UTC值的日期表示,日期为。对于类似于SQL标准TIMESTAMP WITH TIME ZONE的数据库类型,请使用java.time.Instant
  • Instant instant = myResultSet.getObject( … , Instant.class ) ;
  • myPreparedStatement.setObject( instant , … ) ;

  • 细节

    这个问题和其他答案似乎过分考虑了这个问题。 java.sql.Date只是其时间设置为00:00:00java.util.Date

    the java.sql.Date doc(斜体字是我的)…

    Class Date

    java.lang.Object

        java.util.Date        ← Inherits from j.u.Date

            java.sql.Date

    A thin wrapper around a millisecond value that allows JDBC to identify this as an SQL DATE value. A milliseconds value represents the number of milliseconds that have passed since January 1, 1970 00:00:00.000 GMT.  ← Time-of-day set to Zero, midnight GMT/UTC

    To conform with the definition of SQL DATE, the millisecond values wrapped by a java.sql.Date instance must be 'normalized' by setting the hours, minutes, seconds, and milliseconds to zero in the particular time zone with which the instance is associated.



    仅日期与日期时间

    核心问题是:
  • SQL 在SQL中,DATE数据类型仅存储日期,而不存储日期。
  • JAVA 在与早期Java版本 bundle 在一起的,设计不当的日期时间库中,它们未能包含一个仅表示日期的类。

  • Java团队没有创建仅日期的类,而是进行了骇人听闻的破解。他们选择了日期时间类(名称错误的 java.util.Date 类,包含日期和时间),并将其扩展为将实例设置为午夜时间 UTC00:00:00的实例。那个hack,是j.u.Date的子类,是 java.sql.Date

    所有这些黑客攻击,不良的设计和错误的命名都使人感到困惑。

    使用哪个

    那么什么时候使用哪个呢?简单,切穿后的困惑。
  • 在读取或写入数据库的仅日期日期列时,请使用java.sql.Date,因为它笨拙地试图掩盖其时间。
  • 在Java中其他需要的时间以及日期的地方,都可以使用java.util.Date
  • 当您手头有一个java.sql.Date但需要一个java.util.Date时,只需传递java.sql.Date。作为子类,java.sql.Date的是java.util.Date的

  • 更好

    在现代Java中,您现在可以选择合适的日期时间库来替代与Java bundle 在一起的旧的且臭名昭著的java.util.Date,Calendar,SimpleTextFormat和java.sql.Date类。主要选择是:
  • Joda-Time
  • java.time(受Joda-Time启发,由JSR 310定义,与Java 8 bundle 在一起,由ThreeTen-Extra项目扩展)

  • 两者都提供 LocalDate类来仅表示日期,没有时间,也没有时区。

    更新到JDBC 4.2或更高版本的 JDBC driver可用于直接与数据库交换java.time对象。然后,我们可以完全摒弃java.util。*和java.sql。*包中作为日期时间类的丑陋困惑。

    setObject | getObject

    Oracle发布的 This article解释说,如果调用 DATEgetObject方法,则Java 8中的JDBC已透明更新,可以将SQL setObject值映射到新的java.time.LocalDate类型。

    用钝角语言, JDBC 4.2 update spec的底部确认该文章,并在 getObjectsetObject方法中添加了新的映射。
    myPreparedStatement.setObject( … , myLocalDate ) ;

    …和…
    LocalDate myLocalDate = myResultSet.getObject( … , LocalDate.class ) ;

    兑换

    规范还说,已将新方法添加到java.sql.Date类中,以将其来回转换为java.time.LocalDate。
  • public java.time.instant toInstant()
  • public java.time.LocalDate toLocalDate()
  • public static java.sql.Date valueOf(java.time.LocalDate)

  • 时区

    旧的 java.util.Datejava.sql.Datejava.sql.Timestamp始终位于 UTC中。前两个(至少)在其源代码中埋藏着一个时区,但仅在诸如 equals方法之类的表面下使用,并且没有getter/setter方法。

    更令人困惑的是,他们的 toString方法应用了JVM当前的默认时区。因此,对于天真的程序员来说,似乎他们有一个时区,但没有。

    避免这些麻烦的旧旧类的原因很多,埋葬时区和 toString行为都是两个原因。

    使用 java.time(Java 8和更高版本)编写您的业务逻辑。如果缺少java.time,请使用 Joda-Time。 java.time和Joda-Time都有方便的方法来与需要的旧类进行往返。

    更换:
  • java.util.Date替换为 java.time.Instant
  • java.sql.Timestamp 替换为 java.time.Instant
  • java.sql.Date 替换为 java.time.LocalDate
  • java.sql.Time 替换为 java.time.LocalTime

  • Instant 类表示 UTC在时间轴上的某个时刻,分辨率为 nanoseconds(十进制小数的九(9)位)。

    这三个 java.time.Local…类都缺少 time zoneoffset-from-UTC的任何概念。

    关于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对象。使用兼容 JDBC driver或更高版本的 JDBC 4.2。不需要字符串,不需要 java.sql.*类。

    在哪里获取java.time类?
  • Java SE 8Java SE 9Java SE 10和更高版本
  • 内置。
  • 是标准Java API的一部分,具有 bundle 的实现。
  • Java 9添加了一些次要功能和修复。
  • Java SE 6Java SE 7
  • 很多java.time功能都已在ThreeTen-Backport中反向移植到Java 6和7。
  • Android
  • 更高版本的java.time类的Android bundle 实现。
  • 对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。参见How to use ThreeTenABP…

  • ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容打下了基础。您可能会在这里找到一些有用的类,例如 Interval YearWeek YearQuarter more

    关于java - 在java.util.Date或java.sql.Date之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24650186/

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