将Joda LocalTime转换为java.sql.Date

2022-09-01 21:16:59

要进行JDBC查询,我需要向它传递日期。日期保存在PostgreSql数据库的日期字段类型中,该字段类型表示没有时间的特定日期。

由于我只需要日期,我决定使用特定的对象,它只表示没有时间的日期,这是Joda-Time包中的LocalDate。我认为这很重要,因为如果我使用DateTime对象,它将携带冗余的时间数据,并且当时钟倒退一小时时,它可能会导致夏令时结束时的错误(尽管这种情况非常罕见,但这并非不可能)。

但是,当我开始尝试用公认的方法参数来平方对象时,我没有找到一种合适的方法来做到这一点。LocalDatepreparedStatement.setDate

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

但这违背了使用Joda-Time软件包的所有目的,因为在此转换中,我们返回到毫秒,并且当这些转换发生时,时钟可能会放回一小时并将日期更改为以前的日期。LocalDate

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

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

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

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

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


答案 1

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

在推理这些问题时,请务必记住,您当前的时区对转换没有影响,转换由您的区域设置参数化,并且仅在转换的即时上下文中解析时区。

我全心全意地同情你对这一切的厌烦:它正在把一个简单而直接的前行操作变成一个复杂的计算迷宫,除了带来麻烦之外,什么都不做。希望Java 8及其新功能将发生积极的转变(是的,再次!日期/时间API,牢固地基于JodaTime。


答案 2

我今天遇到了同样的问题。我使用的是 JDK 8。经过几个小时的搜索,终于在Java SE 8文档中找到了答案。这是解决方案:

statement.setDate(5, java.sql.Date.valueOf(personToUpdate.getBirthday()));

语句是“准备语句”实例。“personToUpdate.getBirthday()”是LocalDate的类型。