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 有啥区别? [复制]
jdbc-java.sql.date和java.util.date之间转换
java.sql.date和java.util.date的区别和转换