【问题标题】:Converting joda LocalTime to sql Time将 joda LocalTime 转换为 sql 时间
【发布时间】:2012-02-23 22:55:01
【问题描述】:

我想将 LocalTime 对象转换为 java.sql.Time 对象。

java.sql.Time time = new java.sql.Time(new LocalTime(1,0,0,0).getMillisOfDay());
System.out.println(time); //20:00:00

上面的代码并没有创建一个值等于 01:00:00 的 Time 对象,而是创建了一个时间为 20:00:00 的对象。当地时间是东部时间。

我应该采取哪些步骤?

【问题讨论】:

    标签: java jodatime


    【解决方案1】:

    Time(..) 接受从 1970 年开始的时间戳。所以你应该传递它:

    new Time(new LocalTime(...).toDateTimeToday().getMillis())

    【讨论】:

      【解决方案2】:

      我认为当前接受的答案不正确。尽管 java.sql.Time 暗示它的日期字段设置为 1970-1-1,但事实并非如此。如果你使用转换

      new java.sql.Time(new LocalTime(...).toDateTimeToday().getMillis())
      

      那么 java.sql.Time 对象的内部毫秒表示将反映今天的日期。这会在比较 java.sql.Time 对象时导致意外行为。 对毫秒值进行比较,如果底层日期不同,则时间字段与比较结果无关

      更好的方法是显式处理时间字段,使用 java.sql.Time 中已弃用的构造函数和方法:

      LocalTime localTime = new LocalTime(1,0,0,0);
      java.sql.Time sqlTime = new java.sql.Time(localTime.getHourOfDay(), localTime.getMinuteOfHour(), localTime.getSecondOfMinute())
      

      同样,在另一个方向

      java.sql.Time sqlTime = new java.sql.Time(1,0,0);
      LocalTime localTime = new LocalTime(sqlTime.getHours(), sqlTime.getMinues(), sqlTime.getSeconds());
      

      【讨论】:

      • 使用不推荐使用的方法是不好的做法。
      • 当然可以,但是你必须知道什么时候打破规则。这些不推荐使用的方法是实现目标的最简单和最有效的方法,并且在可预见的将来没有计划将它们从 Java 中删除。坦率地说,Sun 不应该弃用它们。取代它们的可怕混乱是转向像 JodaTime 这样更干净的实现的全部原因。
      【解决方案3】:

      这似乎是 Joda Time API 中的一个漏洞。现在getLocalMillis()protected,但这正是我想要使用的方法。

      不过,如果你想避免使用过时的方法,你可以算出 1970 年 1 月 1 日的时间:

      LocalTime lt = new LocalTime(1, 23, 45, 678);
      long millis = lt.toDateTimeToday().withDate(1970, 1, 1).getMillis()
      java.sql.Time time = new java.sql.Time(millis);
      

      这似乎有效。有趣的是,我尝试通过将字段的值相乘来计算出毫秒。这产生了正确的long 值,但是当我将它传递给Time 构造函数时,时区发生了一些奇怪的事情。 (我认为,至少。Time 值在我传入的值之前五个小时结束,而且我在东部夏令时间,所以我认为这就是发生的事情。)

      【讨论】:

        【解决方案4】:

        我找到了另一种将 java.time.LocalTime 转换为 java.time.LocalTime

        的方法
        LocalTime localTime = LocalTime.now();
        Time time = Time.valueOf(localTime);
        

        【讨论】:

        • 问题是关于 Joda-Time 中的 LocalTime,而不是 Java 8 中添加的 LocalTime 类。
        猜你喜欢
        • 1970-01-01
        • 2013-04-17
        • 2014-08-29
        • 2016-11-26
        • 2011-05-01
        • 2015-12-30
        • 1970-01-01
        • 2015-07-08
        • 1970-01-01
        相关资源
        最近更新 更多