假设您至少使用 JDBC 4.2,您应该能够检索LocalTime
从你的结果集中:
LocalTime timeInUtc = yourResultSet.getObject(yourTimeColumn, LocalTime.class);
那么就没有必要为过时的和设计不良的东西而烦恼java.sql.Time
班级。当然,您获得的时间仍将采用 UTC 时间。转换方法如下:
LocalTime timeInUtc = LocalTime.of(3, 0);
ZoneId zone = ZoneId.of("Europe/Berlin");
LocalTime timeInGermany = OffsetDateTime.now(ZoneOffset.UTC)
.with(timeInUtc)
.atZoneSameInstant(zone)
.toLocalTime();
System.out.println("Zeit heute in Deutschland: " + timeInGermany);
当我今天运行代码时,我得到了您期望的输出:
德国时间:05:00
Edit:如果您无法避免java.sql.Time
,将其转换为LocalTime
第一的。假设Time
是在 UTC 中,我们不想依赖脆弱的 JVM 时区设置进行转换,你是对的,我们需要getTime
method:
Time sqlTimeInUtc = // Get from database
LocalTime timeInUtc
= LocalTime.MIDNIGHT.plus(sqlTimeInUtc.getTime(), ChronoUnit.MILLIS);
如果您可以依赖 JVM 时区设置也是 UTC,则以下内容会更好:
LocalTime timeInUtc = sqlTimeInUtc.toLocalTime();
在这两种情况下,其余的都如上所述。
在所有情况下,当您说“应该显示今天的时间”时,都会出现一些极端情况,比如您想要“今天采用 UTC 时区”还是“今天采用欧洲/柏林时区”。还有一种特殊情况,即时间在凌晨 2 点到 3 点之间,而今天是 3 月的最后一个星期日,时钟从 2 点拨到 3 点,开始德国夏令时 (DST)。请仔细考虑这些极端情况并决定您想要什么。
顺便说一下,你的诊断是完全正确的:Time.getTime
返回 1970 年 1 月 1 日的时间,因此当您将其输入Instant
,您将在此日期转换一天中的时间,即没有夏令时。