Time.valueOf 方法返回错误值
Time.valueOf method returning wrong value
我使用方法 Time.valueOf 将字符串 "09:00:00" 转换为时间对象,如下所示: Time.valueOf (LocalTime.parse("09:00:00" )).
当我调用 getTime () 显示我得到的值时:28800000 毫秒而不是 32400000 毫秒(从计算器计算)。
我用Time.value的时候是不是出错了?因为我不明白为什么我得到错误的值。
谢谢。
这是时区问题造成的。如果你这样做
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
在你的代码之前你会得到你期望的 32400000。
Time.valueOf (LocalTime.parse("09:00:00"))
假定 9 在您当地的时区,因此它将其转换为 UTC。
例如,如果时区是 "Asia/Jerusalem"
(你可以用 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jerusalem"));
来模拟它,它是 1970 年 1 月 1 日的 UTC+2,它会将 9 点钟转换为 7 点钟。你可以用System.out.println(time.toGMTString());
看到它
一如既往地在有关旧 java 时间的问题中 api 我必须给你一个强制性建议,始终只使用 modern post java8 api.
坚持java.time.LocalTime
我建议您坚持使用 java.time 中的 LocalTime
,现代 Java 日期和时间 API,不要使用 java.sql.Time
。后者 class 设计不佳,真正的 hack,确实,在已经设计不佳的 java.util.Date
class 之上。幸运的是,它也早已过时。曾经有一段时间,我们需要一个 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()
。
如果您确实需要一个 Time
对象用于一些您现在不想升级的遗留 API,那么您所做的转换是正确的。
你的预期是错误的,你的转换是正确的
Did I make an error when I used Time.value Of ? Because I don't
understand why I get the wrong value.
不,反之亦然。你没有犯错。在这种情况下,您得到了正确的值。这是 Time
捉弄你的糟糕而令人困惑的设计(我说过你不应该想使用那个 class)。我不确定它是否已记录在案,但 Time.valueOf (LocalTime.parse("09:00:00"))
为您提供了一个 Time
对象,该对象内部包含 1970 年 1 月 1 日的时间点 09:00 在您的时区JVM。从你得到的毫秒值来看,28 800 000,好像这个时间等于08:00 UTC。您在 1970 年冬天的 UTC 时区偏移量是 +01:00 吗? getTime()
方法 returns 自 1970 年 1 月 1 日以来的毫秒数 00:00 UTC.
我使用方法 Time.valueOf 将字符串 "09:00:00" 转换为时间对象,如下所示: Time.valueOf (LocalTime.parse("09:00:00" )).
当我调用 getTime () 显示我得到的值时:28800000 毫秒而不是 32400000 毫秒(从计算器计算)。
我用Time.value的时候是不是出错了?因为我不明白为什么我得到错误的值。
谢谢。
这是时区问题造成的。如果你这样做
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
在你的代码之前你会得到你期望的 32400000。
Time.valueOf (LocalTime.parse("09:00:00"))
假定 9 在您当地的时区,因此它将其转换为 UTC。
例如,如果时区是 "Asia/Jerusalem"
(你可以用 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jerusalem"));
来模拟它,它是 1970 年 1 月 1 日的 UTC+2,它会将 9 点钟转换为 7 点钟。你可以用System.out.println(time.toGMTString());
一如既往地在有关旧 java 时间的问题中 api 我必须给你一个强制性建议,始终只使用 modern post java8 api.
坚持java.time.LocalTime
我建议您坚持使用 java.time 中的 LocalTime
,现代 Java 日期和时间 API,不要使用 java.sql.Time
。后者 class 设计不佳,真正的 hack,确实,在已经设计不佳的 java.util.Date
class 之上。幸运的是,它也早已过时。曾经有一段时间,我们需要一个 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()
。
如果您确实需要一个 Time
对象用于一些您现在不想升级的遗留 API,那么您所做的转换是正确的。
你的预期是错误的,你的转换是正确的
Did I make an error when I used Time.value Of ? Because I don't understand why I get the wrong value.
不,反之亦然。你没有犯错。在这种情况下,您得到了正确的值。这是 Time
捉弄你的糟糕而令人困惑的设计(我说过你不应该想使用那个 class)。我不确定它是否已记录在案,但 Time.valueOf (LocalTime.parse("09:00:00"))
为您提供了一个 Time
对象,该对象内部包含 1970 年 1 月 1 日的时间点 09:00 在您的时区JVM。从你得到的毫秒值来看,28 800 000,好像这个时间等于08:00 UTC。您在 1970 年冬天的 UTC 时区偏移量是 +01:00 吗? getTime()
方法 returns 自 1970 年 1 月 1 日以来的毫秒数 00:00 UTC.