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 年的时间。
那么我怎样才能获得这个例子的正确时间呢?
假设您至少使用 JDBC 4.2,您应该能够LocalTime从结果集中检索 a:
LocalTime timeInUtc = yourResultSet.getObject(yourTimeColumn, LocalTime.class);\nRun Code Online (Sandbox Code Playgroud)\n\n那么\xe2\x80\x99s 就不需要为过时且设计不良的java.sql.Time类而烦恼。当然,您获得的时间仍将采用 UTC 时间。这里\xe2\x80\x99s如何转换:
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);\nRun Code Online (Sandbox Code Playgroud)\n\n当我今天运行代码时,我得到了您期望的输出:
\n\n\n\n\n德国时间:05:00
\n
编辑:如果有 \xe2\x80\x99s 无法避免获得java.sql.Time,请先将其转换为LocalTime。假设采用TimeUTC 格式,并且我们不想依赖脆弱的 JVM 时区设置进行转换,那么我们需要该getTime方法是正确的:
Time sqlTimeInUtc = // Get from database\n LocalTime timeInUtc \n = LocalTime.MIDNIGHT.plus(sqlTimeInUtc.getTime(), ChronoUnit.MILLIS);\nRun Code Online (Sandbox Code Playgroud)\n\n如果您可以依赖 JVM 时区设置也是 UTC,那么以下内容会更好:
\n\n LocalTime timeInUtc = sqlTimeInUtc.toLocalTime();\nRun 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,您正在转换该日期的时间,即没有夏令时。
| 归档时间: |
|
| 查看次数: |
3086 次 |
| 最近记录: |