将 UTC java.sql.Time 转换为具有正确 DST 的 java.time.localtime

Hol*_*eid 3 java time localtime

我在将从数据库获取的 java.sql.Time (UTC) 转换为 java.time.LocalTime (GMT+1 DST) 时遇到问题。总是缺少 DST 时间。因此,时间 03:00 仅转换为本地时间 04:00,而不是 05:00。

//Saved UTC time in DB: 03:00
LocalTime.ofInstant(Instant.ofEpochMilli(sqlTime.getTime()), ZoneId.of("Europe/Berlin"));
=> 04:00 //expected 05:00
Run Code Online (Sandbox Code Playgroud)

我猜问题是 java.sql.Time 使用默认日期 1970-01-01 保存时间,而 1970 年德国没有夏令时。但当然应该显示今天的时间,而不是 1970 年的时间。

那么我怎样才能获得这个例子的正确时间呢?

Ole*_*.V. 5

假设您至少使用 JDBC 4.2,您应该能够LocalTime从结果集中检索 a:

\n\n
    LocalTime timeInUtc = yourResultSet.getObject(yourTimeColumn, LocalTime.class);\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么\xe2\x80\x99s 就不需要为过时且设计不良的java.sql.Time类而烦恼。当然,您获得的时间仍将采用 UTC 时间。这里\xe2\x80\x99s如何转换:

\n\n
    LocalTime timeInUtc = LocalTime.of(3, 0);\n\n    ZoneId zone = ZoneId.of("Europe/Berlin");\n    LocalTime timeInGermany = OffsetDateTime.now(ZoneOffset.UTC)\n            .with(timeInUtc)\n            .atZoneSameInstant(zone)\n            .toLocalTime();\n\n    System.out.println("Zeit heute in Deutschland: " + timeInGermany);\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我今天运行代码时,我得到了您期望的输出:

\n\n
\n

德国时间:05:00

\n
\n\n

编辑:如果有 \xe2\x80\x99s 无法避免获得java.sql.Time,请先将其转换为LocalTime。假设采用TimeUTC 格式,并且我们不想依赖脆弱的 JVM 时区设置进行转换,那么我们需要该getTime方法是正确的:

\n\n
    Time sqlTimeInUtc = // Get from database\n    LocalTime timeInUtc \n            = LocalTime.MIDNIGHT.plus(sqlTimeInUtc.getTime(), ChronoUnit.MILLIS);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您可以依赖 JVM 时区设置也是 UTC,那么以下内容会更好:

\n\n
    LocalTime timeInUtc = sqlTimeInUtc.toLocalTime();\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这两种情况下,其余的都如上所述。

\n\n

在所有情况下,当您说时,是否想要 UTC\xe2\x80\x9d 中的 \xe2\x80\x9ctoday 或欧洲/柏林时区 \xe2\x80\x9ctoday \xe2\x80\x9d 的问题存在一些极端情况\xe2\x80\x9c应该显示今天的时间\xe2\x80\x9d。如果时间在凌晨 2 点到 3 点之间,并且今天是 3 月的最后一个星期日,则还有一种特殊情况,时钟从 2 点拨到 3 点以启动德国夏令时 (DST)。请仔细考虑这些极端情况并决定您想要什么。

\n\n

顺便说一句,您的诊断是完全正确的:Time.getTime返回 1970 年 1 月 1 日的时间,因此当您将其输入到 时Instant,您正在转换该日期的时间,即没有夏令时。

\n