[我使用方法Time.valueOf将字符串“ 09:00:00”转换为Time对象,如下所示:Time.valueOf(LocalTime.parse(“ 09:00:00”))。
[当我调用getTime()以显示值时,我得到:28800000 ms,而不是32400000ms(通过计算器计算)。
我使用Time.value Of时是否出错?因为我不明白为什么我得到错误的值。
谢谢。
[我建议您坚持使用java.time(现代Java日期和时间API)中的LocalTime
,不要使用java.sql.Time
。后一类的设计很差,实际上是在本来设计很差的java.util.Date
类的基础上进行的。幸运的是,它也早已过时。曾经有一段时间,我们需要Time
对象将一天中的某个时间存储到数据类型time
的数据库列中,或将时间转移到使用该数据类型的SQL查询中。从JDBC 4.2开始,情况不再如此。现在,您的JDBC驱动程序接受一个LocalTime
对象,并将其时间值传递给数据库。
因此,如果您有一个字符串,请按照已经使用的方式将其解析为LocalTime
对象:
LocalTime time = LocalTime.parse("09:00:00");
如果不需要使用字符串,则可以使用of
工厂方法来获得相同的结果,例如:
LocalTime time = LocalTime.of(9, 0);
我不知道为什么要将其转换为毫秒,但是您可以:
int milliOfDay = time.get(ChronoField.MILLI_OF_DAY);
System.out.println(milliOfDay);
输出为:
32400000
这是您说的期望值。
将LocalTime
插入数据库:
PreparedStatement ps = yourDatabaseConnection.prepareStatement(
"insert into your_table(your_time_col) values (?)");
ps.setObject(1, time);
int rowsInserted = ps.executeUpdate();
注意使用setObject()
,而不是setTime()
。
如果您确实不想立即升级某些旧版API时需要Time
对象,则您所做的转换是正确的。
我使用Time.value Of时是否出错?因为我不了解为什么我得到错误的值。
不,相反。您没有犯错。在这种情况下,您得到了正确的值。这是Time
的一个令人毛骨悚然的设计,正在欺骗您(我说过您不希望使用该课程)。我不确定文件是否已记录,但是Time.valueOf (LocalTime.parse("09:00:00"))
为您提供了Time
对象,该对象内部保存的时间点为1970年1月1日09:00 在JVM的时区中。从您获得的毫秒值28,800,000,看来这一次等于08:00 UTC。您的UTC时区在1970年冬天偏移+01:00吗? getTime()
方法返回自1970年1月1日00:00 UTC以来的毫秒数。
是由时区问题引起的。如果您这样做