gpt4 book ai didi

java - 使用正确的 DST 将 UTC java.sql.Time 转换为 java.time.localtime

转载 作者:行者123 更新时间:2023-11-30 06:42:48 25 4
gpt4 key购买 nike

我在将从数据库获取的 java.sql.Time (UTC) 转换为 java.time.LocalTime (GMT+1 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

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

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

最佳答案

假设您至少使用 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);

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

Zeit heute in Deutschland: 05:00

编辑:如果您无法避免获取 java.sql.Time,请先将其转换为 LocalTime。假设 Time 是 UTC 并且我们不想依赖脆弱的 JVM 时区设置进行转换,你是对的,我们需要 getTime 方法:

    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 时,您正在转换该日期的时间,即没有夏令时。

关于java - 使用正确的 DST 将 UTC java.sql.Time 转换为 java.time.localtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52966281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com