要进行 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/