将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