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

2024-02-04

我在将从数据库获取的 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

我猜问题是 java.sql.Time 使用默认日期 1970-01-01 保存时间,而 1970 年德国没有 DST。但当然应该显示今天的时间,而不是 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);

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

德国时间: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,您将在此日期转换一天中的时间,即没有夏令时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何在 Android Studio Logcat 中突出显示过滤器/搜索命中

    我根据单个字符串过滤 Logcat 行 如下所示 但在那里 我面临着许多很长的队伍 而且我很难识别队伍中间想要的值 例如 在上图中 看到所有 聚合 关键字突出显示会非常方便 有没有办法在 Logcat 控制台上突出显示过滤 搜索命中 据我所
  • 禁用的按钮在 Firefox 和 Chrome 中看起来已启用

    禁用的按钮在 Firefox 和 Chrome 中看起来已启用 我在 ie firefox chrome 中打开同一页面 这是输出 仪表板 和 日历 被禁用 代理信息 已启用 这里我使用带有 css 的普通 asp 按钮 我该怎么办 您可以
  • 替换标签并保留属性[重复]

    这个问题在这里已经有答案了 可能的重复 更改标签名称但保留所有属性 https stackoverflow com questions 6482847 change the tag name but keep all the attribu
  • Javascript - 从数组中删除唯一元素

    我想知道如何从数组中删除唯一元素 例如 var arr 1 2 2 4 4 会回来 2 2 4 4 Where 1 2 3 会回来 因为所有元素都是独一无二的 我相信我需要将每个元素与数组中的每个其他元素进行检查 但我不确定如何进行此操作
  • 数据结构成员的成员初始化

    我刚刚遇到了一个尴尬的问题 这个问题很容易解决 但我不喜欢这样做 在我的类的构造函数中 我正在初始化数据成员的数据成员 这是一些代码 class Button private The attributes of the button SDL
  • 如何使用Mono的“缓存”方法

    我是 spring webflux 的初学者 在研究时我发现了一些代码 例如 Mono result someMethodThatReturnMono cache 缓存 这个名字告诉我关于缓存某些东西 但是缓存在哪里以及如何检索缓存的东西
  • android 从 JavascriptInterface 启动Activity

    简单的一般问题 Webview 连接到我的 JavascriptInterface 类 并且它肯定是有用的 但是 因为 JavascriptInterface 不扩展 Activity 所以我似乎无法使用 startActivity int
  • 锦标赛分组放置算法

    给定对手种子列表 例如种子 1 到 16 我正在尝试编写一种算法 该算法将导致头号种子在该轮中对阵最低的种子 第二名种子对阵第二低的种子 依此类推 将 1 和 16 2 和 15 等分组为 比赛 相当容易 但我还需要确保较高的种子将在后续回
  • 使用C#或Powershell扫描所有可用的无线网络并连接到特定的SSID

    我正在尝试编写一个脚本来扫描所有可用的无线网络并连接到特定网络 SSID 有人已经为此编写了示例代码吗 由于某些限制 我无法安装第三方软件 托管 wifi api 查看这篇相关文章 在 C 中管理无线网络连接 https stackover
  • 未捕获的类型错误:无法解析模块说明符“firebase/app”。相对引用必须以“/”、“./”或“../”开头

    我遵循了有关 WebRTC 视频聊天的 YouTube 教程 因此我尝试编写它 在 localhost 中它可以工作 但是当我将其上传到 firebase 托管时 它就会出现此错误 我能做些什么 我是网络开发新手 所以请耐心等待 主要 ht
  • 如何从字符串中删除0

    我正在看函数trim但不幸的是 这并没有删除 0 我该如何将其添加到其中 我应该使用str replace 编辑 我要修改的字符串是一个消息编号 如下所示 00023460 功能ltrim 00023460 0 正是我需要的 显然我不想使用
  • 在 Python 中模拟导入模块

    我正在尝试对使用导入的外部对象的函数实施单元测试 例如助手 py is import os import pylons def some func arg var1 os path exist var2 os path getmtime v
  • 无法使用 OpenCV 从辅助网络摄像头的 VideoCapture 读取帧

    Code 与主网络摄像头 设备 0 完美配合的简单示例 VideoCapture cap 0 if cap isOpened std cout lt lt Unable to read stream from specified devic
  • 为什么我在 raw_input 期间无法捕获 KeyboardInterrupt?

    这是一个测试用例 try targ raw input Please enter target except KeyboardInterrupt print Cancelled print targ 当我按 ctrl c 时 我的输出如下
  • SqlAlchemy - 按关系属性过滤

    我对 SQLAlchemy 没有太多经验 但我遇到了一个无法解决的问题 我尝试搜索并尝试了很多代码 这是我的课程 简化为最重要的代码 class Patient Base tablename patients id Column Integ
  • 在 Bolts 中,如何使用 continueWith() 和 continueWithTask()?

    除了同步与异步之外 它们文档中的差异也让我感到困惑 他们的例子github页面 https github com BoltsFramework Bolts Android chaining tasks together看起来仍然是同步调用的
  • Netbeans - 从数据库生成实体类

    我使用的是 netbeans IDE 7 1 我正在尝试从数据库 sql server 生成实体类 我能够设置与此远程数据源的连接 但在数据库向导的新实体类中 表没有显示 并且在底部显示 选择至少一个表 我可以执行查询并浏览 netbean
  • 如何在Altera Quartus中生成.rbf文件?

    什么是 rbf 文件以及如何在 Windows 上从 Quartus 输出文件 sof 生成它们 An RBF is a 原始二进制文件例如 它代表原始数据 这些数据将被加载到闪存中 以便在上电时初始化 FPGA A SOF is an S
  • 获取数据访问层内的数据库上下文

    我在尝试解决 EF Core 方面的一些问题 我使用 MVC Core 应用程序中的启动代码来初始化数据库上下文 这是我的数据库上下文 public class AccountsDBContext DbContext public Acco
  • 将 UTC java.sql.Time 转换为具有正确 DST 的 java.time.localtime

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