java.util.Date 到 java.sql.Date 不包含时间

Posted

技术标签:

【中文标题】java.util.Date 到 java.sql.Date 不包含时间【英文标题】:java.util.Date to java.sql.Date doesn't contain Time 【发布时间】:2015-08-09 08:07:40 【问题描述】:

我在PreparedStatement 上收到SqlException,因为它违反了表上的唯一性约束(重复键)。基本上我的表是这样的:

mytable
=======
mytable_id        PRIMARY KEY INT NOT NULL
fizz_id           INT NOT NULL
buzz_timestamp    DATETIME

唯一性约束在buzz_timestamp上;也就是说,没有 2 条记录可能具有相同的日期/时间“时间戳”。

将记录插入此表的PreparedStatement 如下所示:

PreparedStatement ps = conn.prepareStatement(insertQuery);
ps.setDate(1, new java.sql.Date(new java.util.Date().getTime()));

所以你可以看到我正在使用 java.util.Date()(“现在”)并将其转换为 java.sql.Date 实例。

我看到的确切错误(dupe key)一直抱怨我试图将2015-05-27 00:00:00.0000000 插入到buzz_timestamp 的表中,但它已经存在。因此,很明显,我使用了错误的 Date API,并且我插入了具有无效时间组件的日期,从而产生了重复密钥异常。

所以我问:我该如何纠正这个问题,以便我真正为“现在”插入日期和时间?

【问题讨论】:

检查这个问题:***.com/questions/6777810/… 如果您使用的是 Java 8,请使用 java.time.LocalDateTime 而不是 java.util.Date 【参考方案1】:

使用

ps.setTimestamp(new java.sql.Timestamp(System.currentTimeMillis());

看到这个:Using setDate in PreparedStatement

【讨论】:

【参考方案2】:

java.sql.Date 扩展 java.util.Date 但工作方式不同:在 SQL 中,DATE 没有时间。因此,Java 对象也会忽略小时、分钟等。

改用java.sql.Timestamp,但您可能需要强制转换(在SQL 中)将其转换为DATETIME

相关:

mssql 2005 datetime and jdbc

【讨论】:

【参考方案3】:

你需要尝试 setTimestamp 而不是 setDate

java.sql.Date - A date only (no time part)
java.sql.Time - A time only (no date part)
java.sql.Timestamp - Both date and time

【讨论】:

【参考方案4】:

accepted answer 是正确的。我会添加一个解释。

令人困惑的黑客

在 SQL 中,DATE 是没有时间或时区的仅日期值。

与 Java 捆绑在一起的旧日期时间类一团糟,缺少任何此类来表示仅日期值。

相反,Java 团队创建了一个 hack。他们通过扩展 java.util.Date 创建了 java.sql.Date,尽管它的名称令人困惑,但它有一个日期部分一个时间部分。对于面向 SQL 的子类,他们将时间部分设置为零值。您可能会将其视为“午夜”。所以 java.sql.Date 一个时间,但假装没有。

引用java.SQL.Date文档:

为了符合 SQL DATE 的定义,由 java.sql.Date 实例包装的毫秒值必须通过在特定时区中将小时、分钟、秒和毫秒设置为零来进行“规范化”。实例已关联。

对于 SQL 中的日期和时间值,请使用 java.sql.Timestamp 类,如 accepted answer 所示。

java.time

这些设计不佳的日期时间类已被 Java 8 及更高版本中内置的新 java.time 包所取代。这个包的灵感来自 Joda-Time 库。

Java.time 包包括表示仅日期和仅时间类的类。最终,JDBC 驱动程序将升级为直接支持新的数据类型。在那之前,使用添加到新旧类中的几种转换方法。在 ***.com 上搜索许多示例和讨论,因为这个问题在很大程度上是重复的。

【讨论】:

以上是关于java.util.Date 到 java.sql.Date 不包含时间的主要内容,如果未能解决你的问题,请参考以下文章

java.util.Date与java.sql.Date

java.util.Date 和 java.sql.Date 有啥区别? [复制]

jdbc-java.sql.date和java.util.date之间转换

java.sql.date和java.util.date的区别和转换

java.util.Date 不能转换为 java.sql.Date [重复]

util.date和sql.date的衔接处理