ovg*_*vin 22 java date jdbc jodatime
要进行JDBC查询,我需要将日期传递给它.日期保存在PostgreSql数据库的Date字段类型中,表示特定日期没有任何时间.
因为我只需要约会,所以我决定使用特定的对象,它只代表没有时间的日期,这是LocalDate来自Joda-Time包.我认为这很重要,因为如果我使用DateTime对象,它将携带冗余时间数据,并且当时钟向后放置一小时时可能导致夏令时结束时的错误(尽管情况空前罕见,但不是不可能).
但是当我开始尝试LocalDate使用preparedStatement.setDate方法的公认参数来对象时,我找不到合适的方法来做到这一点.
setDate接受java.sql.Date作为参数.构造java.sql.Date对象的唯一选择是以毫秒为单位传递时间.
但是这违背了使用LocalDateJoda-Time软件包的所有目的,因为在这个转换中我们会回到毫秒,并且在这些转换发生时,时钟可能会被放回一小时并将日期更改为上一个日期.
所以,现在我的代码中有这一行:
preparedStatement.setDate(1, new java.sql.Date(localDate.toDate().getTime()));
Run Code Online (Sandbox Code Playgroud)
但这是转换LocalDate为setDate格式接受的最佳方式吗?
我的担忧是否与夏令时和相应的时钟转换相关?
有没有更好的方法将日期(并且只有没有时间的日期)传递给JDBC preparedStatement?
Mar*_*nik 11
使用您的技术应该是安全的,因为所有时区问题都将被考虑在内LocalDate#toDate.您所拥有的毫秒级瞬间与上下文无关:它与您用于转换的语言环境中该时间点有效的时区唯一关联.换句话说,如果您在一年内重复完全相同的毫秒值转换,即使时区法规在此期间发生变化,您仍将始终获得完全相同的答案,因为JDK指的是记录完整历史记录的数据库所有时区的变化都在世界各地.
在推理这些问题时,请务必记住,您当前的时区对转换没有影响,转换由您的语言环境参数化,并仅在转换瞬间的上下文中解析时区.
我全心全意地同情你对这一切的不满:它正在将一个简单而直接的操作变成一个复杂的计算迷宫,除了招惹麻烦之外别无所求.希望Java 8及其新的(是的,再次!)日期/时间API在JodaTime的基础上取得积极的转变.
| 归档时间: |
|
| 查看次数: |
13888 次 |
| 最近记录: |