Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 返回错误值的方法的Time.valueOf_Java_Time_Localtime - Fatal编程技术网

Java 返回错误值的方法的Time.valueOf

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"));

我使用Time.valueOf方法将字符串“09:00:00”转换为Time对象,如下所示:Time.valueOf(LocalTime.parse(“09:00:00”))

当我调用getTime()来显示我得到的值时:288000ms而不是3240000 ms‬‬ ms(通过计算器计算)

我使用时间时是否出错。的值?因为我不明白为什么我得到了错误的值


谢谢。

这是时区问题造成的。如果你这样做

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补充了一个解释。