将joda LocalTime转换为sql时间

pge*_*oft 6 java jodatime

我想将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
Run Code Online (Sandbox Code Playgroud)

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

我应该采取什么措施?

Boz*_*zho 7

Time(..) 接受从1970年开始的时间戳.所以你应该通过:

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


Bra*_*rds 7

我认为目前接受的答案是不正确的.虽然java.sql.Time暗示其日期字段设置为1970-1-1,但事实并非如此.如果您使用转换

new java.sql.Time(new LocalTime(...).toDateTimeToday().getMillis())
Run Code Online (Sandbox Code Playgroud)

那么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())
Run Code Online (Sandbox Code Playgroud)

同样,在另一个方向

java.sql.Time sqlTime = new java.sql.Time(1,0,0);
LocalTime localTime = new LocalTime(sqlTime.getHours(), sqlTime.getMinues(), sqlTime.getSeconds());
Run Code Online (Sandbox Code Playgroud)

  • 当然可以,但你必须知道什么时候打破规则.这些不推荐使用的方法是实现目标的最简单,最有效的方法,并且在可预见的将来,没有计划将它们从Java中删除.坦率地说,Sun永远不应该弃用它们; 替换它们的可怕混乱是转移到像JodaTime这样更清洁的实现的全部理由. (5认同)
  • 使用弃用的方法是不好的做法. (2认同)