我想将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的对象。当地时间是东部时间。
我应该采取什么措施?
答案 0 :(得分:6)
Time(..)
接受从1970年开始的时间戳。所以你应该通过它:
new Time(new LocalTime(...).toDateTimeToday().getMillis())
答案 1 :(得分:6)
我认为目前接受的答案是不正确的。虽然java.sql.Time暗示其日期字段设置为1970-1-1,但事实并非如此。如果您使用转换
new java.sql.Time(new LocalTime(...).toDateTimeToday().getMillis())
然后java.sql.Time对象的内部millesecond表示将反映今天的日期。在比较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());
答案 2 :(得分:0)
这似乎是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
价值在我传入的价值前五个小时结束,我在东部夏令时,所以我认为这就是发生的事情。)
答案 3 :(得分:-1)
我找到另一种方法将 java.time.LocalTime 转换为 java.time.LocalTime
LocalTime localTime = LocalTime.now();
Time time = Time.valueOf(localTime);