java - 将 Joda LocalTime 转换为 java.sql.Date

标签 java date jdbc jodatime

要进行 JDBC 查询,我需要将日期传递给它。日期保存在 Date field PostgreSql 数据库的类型,表示具体的一天,没有任何时间。

因为我只需要日期,所以我决定使用只表示日期而不表示时间的特定对象,即 LocalDate from Joda-Time package .我认为这很重要,因为如果我使用 DateTime 对象,它会携带多余的时间数据,并且可能会在夏令时结束时将时钟向后拨一小时导致错误(尽管这种情况前所未有,但并非如此不可能)。

但是当我开始尝试将 LocalDate 对象与 preparedStatement.setDate 方法的可接受参数平方时,我没有找到合适的方法。

setDate 接受 java.sql.Date 作为参数。而构造 java.sql.Date 对象的唯一选择是以毫秒为单位传递时间。

但这违背了使用 Joda-Time 包中的 LocalDate 的所有目的,因为在这种转换中,我们回到毫秒,当这些转换发生时,时钟可能会延迟一小时并改变日期到前一个日期。

所以,现在我的代码中有这一行:

preparedStatement.setDate(1, new java.sql.Date(localDate.toDate().getTime()));

但这是将 LocalDate 转换为 setDate 格式接受的最佳方法吗?

我对夏令时和相应的时钟变化的担忧是否合理?

有没有更好的方法将日期(并且只有没有时间的日期)传递给 JDBC PreparedStatement?

最佳答案

使用您的技术应该是安全的,因为所有时区问题都会被 LocalDate#toDate 考虑在内。您所拥有的毫秒瞬间与上下文无关:它与您用于转换的区域设置内的那个时间点有效的时区唯一相关。换句话说,如果您在一年中重复转换完全相同的毫秒值,您将始终得到完全相同的答案,即使在此期间您所在位置的时区规定发生变化,因为 JDK 指的是到记录世界各地所有时区变化的完整历史的数据库。

在推理这些问题时,重要的是要记住您当前的时区对转换没有影响,这是由您的 locale 参数化的,并且仅在被转换的瞬间的上下文中解析时区.

我衷心地同情你对这一切的不安:它把一个简单而直接的操作变成了一个复杂的计算迷宫,只会招来麻烦。希望 Java 8 及其基于 JodaTime 的新(是的,再次!)日期/时间 API 会发生积极的变化。

关于java - 将 Joda LocalTime 转换为 java.sql.Date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190035/

相关文章:

javascript - 如何检查字符串是否为合法的 "dd/mm/yyyy"日期?

java - 查找包含文本的元素

java - FF a b FF 的正则表达式是什么?

java - 在条件表达式中混合 Integer 和 Double

function - 如何从Presto中的日期获取月份名称

java - 将小时添加到包含 00 :00:00 的字符串

java - 将 IvyDE 与不同分支上的不同工作区一起使用

java - IO 错误 : Got minus one from a read call

oracle - oracle 8i的jdbc驱动选择

java - getObject(index, Long) 对于 null 返回 0