2012-02-23 85 views
6

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

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的对象。当地时间是东部时间。

我应该采取哪些措施?

回答

6

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

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

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

使用不赞成的方法是不好的做法。 – pgerstoft 2013-07-02 18:47:37

+3

当然,但你必须知道什么时候打破规则。这些被弃用的方法是实现该目标的最简单和最有效的方法,并且在可预见的将来没有计划将它们从Java中移除。坦率地说,孙永远不应该弃用他们;那些替代他们的可怕混乱是整个理由转向像JodaTime这样的更清晰的实现。 – 2013-07-04 13:26:09

0

这似乎是在约达时间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价值结束了我通过的价值前五小时,而我在东部夏令时,所以我认为这就是发生了什么。)

0

我发现了另一种方法来转换java.time.LocalTimejava.time.LocalTime

LocalTime localTime = LocalTime.now(); 
Time time = Time.valueOf(localTime); 
+0

问题是关于Joda-Time中的LocalTime,而不是Java 8中添加的LocalTime类。 – 2017-04-05 14:04:07

相关问题