Time.valueOf方法返回错误值

问题描述 投票:3回答:2

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

[当我调用getTime()以显示值时,我得到:28800000 ms,而不是32400000‬‬ms(通过计算器计算)。

我使用Time.value Of时是否出错?因为我不明白为什么我得到错误的值。

谢谢。

java time localtime
2个回答
2
投票

粘贴到java.time.LocalTime

[我建议您坚持使用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以来的毫秒数。


3
投票

是由时区问题引起的。如果您这样做

© www.soinside.com 2019 - 2024. All rights reserved.