Java 返回错误值的方法的Time.valueOf
我使用Time.valueOf方法将字符串“09:00:00”转换为Time对象,如下所示:Time.valueOf(LocalTime.parse(“09:00:00”)) 当我调用getTime()来显示我得到的值时:288000ms而不是3240000 ms ms(通过计算器计算) 我使用时间时是否出错。的值?因为我不明白为什么我得到了错误的值Java 返回错误值的方法的Time.valueOf,java,time,localtime,Java,Time,Localtime,我使用Time.valueOf方法将字符串“09:00:00”转换为Time对象,如下所示:Time.valueOf(LocalTime.parse(“09:00:00”)) 当我调用getTime()来显示我得到的值时:288000ms而不是3240000 ms ms(通过计算器计算) 我使用时间时是否出错。的值?因为我不明白为什么我得到了错误的值 谢谢。这是时区问题造成的。如果你这样做 TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
谢谢。这是时区问题造成的。如果你这样做
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
在您的代码之前,您将获得3240000 如你所料
Time.valueOf(LocalTime.parse(“09:00:00”))
假设九是在您的本地时区,因此它将其转换为UTC
例如,如果时区是“亚洲/耶路撒冷”
(您可以使用TimeZone.setDefault(TimeZone.getTimeZone(“亚洲/耶路撒冷”);
在1970年1月1日是UTC+2,它会将9点转换为7点。您可以使用System.out.println(time.togmstring());
像往常一样,在关于旧java时间api的问题中,我必须给您一个强制性的建议,始终只使用后java8 api。坚持使用java.time.LocalTime
我建议您坚持使用java.time中的LocalTime
,这是现代java日期和时间API,不要使用java.sql.time
。后一个类的设计很差,确实是一个真正的黑客,在已经设计很差的java.util.date
类的基础上。幸运的是,它也早已过时。曾经有一段时间我们需要一个Time
对象,用于将一天中的某个时间存储到数据类型为Time
的数据库列中,或使用该数据类型将时间传输到SQL查询。自JDBC 4.2以来,情况不再如此。现在,您的JDBC驱动程序接受一个LocalTime
对象,并将其时间值传递给数据库
因此,如果您有一个字符串,请将其解析为LocalTime
对象,就像您已经做的那样:
LocalTime time = LocalTime.parse("09:00:00");
如果不需要遍历字符串,可以使用工厂方法的获得相同的结果,例如:
LocalTime time = LocalTime.of(9, 0);
我不知道您为什么要将其转换为毫秒,但您可以:
int milliOfDay = time.get(ChronoField.MILLI_OF_DAY);
System.out.println(milliOfDay);
输出为:
3240000
这是您所说的预期值
要将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.valueOf(LocalTime.parse(“09:00:00”))
为您提供一个时间
对象,该对象在JVM的时区中内部保存一个时间点1970年1月1日09:00。从您获得的毫秒值28 800 000来看,这个时间似乎等于UTC 08:00。您的时区在1970年冬季的UTC偏移量是否为+01:00?getTime()
方法返回自1970年1月1日00:00 UTC以来的毫秒数。根据我自己的理解:java.sql.time
是java.util.date
(上面写着)的一个薄包装。而date
使用本地TZ…这就是这个问题的根源吗?@andrewjames I补充了一个解释。