将Joda LocalTime转换为java.sql.Date
为了创建JDBC查询,我需要将日期传递给它。 日期保存在PostgreSql数据库的Date
字段类型中,该Date
字段类型表示没有任何时间的特定日期。
由于我只需要日期,因此我决定使用仅表示没有时间的日期的特定对象,即Joda-Time包中的LocalDate
。 我认为这很重要,因为如果我使用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准备好的语句传递给日期(并且只有没有时间的日期)?
使用你的技术应该是安全的,因为LocalDate#toDate
会考虑到所有的时区问题。 您所得到的毫秒级瞬间是独立于上下文的:它与您在用于转换的语言环境中该时间点有效的唯一时区相关。 换句话说,如果您在一年中重复转换完全相同的毫秒值,即使时区规则在您的位置发生变化,您也始终可以得到完全相同的答案,因为JDK指的是记录完整历史记录的数据库世界各地的所有时区变化。
在推理这些问题时,请务必记住,您当前的时区对转换没有影响,该转换由您的区域设置进行参数化,并仅在正在转换的时间点的上下文内解析时区。
我全心全意地同情你在这一切中所发生的尴尬局面:它将一个简单而直接的操作转变成一个复杂的计算迷宫,它只会招致麻烦。 希望Java™8和它的新的(是的,再次!)日期/时间API能够带来积极的转机,它基于JodaTime。
我今天遇到了同样的问题。 我正在使用JDK 8.最后花了几个小时搜索后,我在Java SE 8文档中找到了答案。 这是解决方案:
statement.setDate(5, java.sql.Date.valueOf(personToUpdate.getBirthday()));
语句是PreparedStatement实例。 “personToUpdate.getBirthday()”是LocalDate的类型。
由于org.joda.time.toDateMidnight()和org.joda.time.toDateMidnight(DateTimeZone区域)已被弃用,这是完全适合我的解决方案。
我典型的类,要坚持:
...
import org.joda.time.LocalDate;
...
public class MyObject implements Serializable {
...
private LocalDate startDate;
...
private EndDate startDate;
// Getters and Setters
...
...
}
在我坚持startDate的我的其他类中,我有:
myObject.setStartDate(new LocalDate(myObject.getStartDate().toDateTimeAtStartOfDay(DateTimeZone.getDefault())));
链接地址: http://www.djcxy.com/p/3053.html
上一篇: Converting Joda LocalTime to java.sql.Date
下一篇: Java equivalent of .NET DateTime.MinValue, DateTime.Today