如何从 MySQL DATETIME 转换为 java.time.Instant 并在系统默认时区显示给用户?

Posted

技术标签:

【中文标题】如何从 MySQL DATETIME 转换为 java.time.Instant 并在系统默认时区显示给用户?【英文标题】:How do I convert from MySQL DATETIME to java.time.Instant and display to user in system default timezone? 【发布时间】:2019-09-10 02:40:12 【问题描述】:

我正在为学校做一个项目,但我完全不知所措。这是背景:

我正在开发一个将在本地运行的 JavaFX 约会应用程序,因此我无需担心服务器端时区与实际用户时间不同的后果。我不能使用任何 3rd 方库。该应用程序当前使用一个 DatePicker 和两个 ComboBox 控件供用户输入日期、小时和分钟值。这些使用传统的 get/set 方法存储在 Instant 变量(start)中的 Appointment 对象上。我成功地从控件写入数据库,结果如我所料。如果我选择 2019 年 6 月 31 日和 12:00,然后将其写入数据库,它会显示在数据库中,存储在开始列(数据类型为 DATETIME)中,为 2019-12-31 17:00: 00.我在 CST,所以我的 UTC 偏移量是 -5 小时。到目前为止,我相信一切都很美好。

从这里开始,有些东西向南。我在 ResultSet 中的每个项目上使用类似这样的东西将每个 DB 约会映射到 ObservableList 对象

Instant start = i_rs.getTimestamp("start").toInstant();
Return newAppointment(start);

对 Instant start 变量的值检查给了我:

2019-12-31T17:00

正如我所料。但是,我似乎无法将此时间成功转换为用户的时区。我最接近的是这个:

ZonedDateTime localStartDate = currentAppointment
            .getStart()
            .atZone(ZoneId.systemDefault());

但这会返回

2019-12-31T17:00-05:00

我也试过

ZonedDateTime zdt = date.atZone(ZoneOffset.systemDefault());

但它最终将我的时间转移到错误的方向,让我与

2019-12-31T22:00

我已经为这个“简单”的小部分工作了一天多。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:
ZonedDateTime localStartDate = currentAppointment
  .getStart()
  .atZone(ZoneId.systemDefault());

这里你说“我有一些时间戳,把它当作 CST” 这就是为什么它变成“17:00-05:00”

您似乎将时间戳存储在 UTC 中(如果您不这样做,那么我建议您将编写代码更改为始终存储在 UTC 中)所以您应该告诉 Java

ZonedDateTime localStartDate = currentAppointment
  .getStart()
  .atZone(ZoneId.of("UTC")) // my instant is UTC
  .withZoneSameInstant(ZoneId.systemDefault()) // convert to my local zone

【讨论】:

我无法投票,但这让我得到了正确的答案。看来,我确实没有从数据库中得到正确的时间。仅执行转换Instant start = i_rs.getTimestamp("start").toInstant(); 不足以将数据库检索到的时间适当地存储为瞬间,以及从数据库接收到的确切时间。它正在被转换。 Instant start = i_rs.getTimestamp("start") .toLocalDateTime() .toInstant(ZoneOffset.UTC); 是什么让我到了那里。谢谢您的帮助。今天,你是我的英雄。 如果答案对您有帮助或者是正确答案,则接受正确答案。 完成。抱歉,我没有看到那里的复选框。

以上是关于如何从 MySQL DATETIME 转换为 java.time.Instant 并在系统默认时区显示给用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySql 数据库中获取日期到 C# DateTime 对象?

使用 C# 为 MySQL 转换 DateTime

使用 C# 为 MySQL 转换 DateTime

如何将 mysql 连接器 SELECT 结果“datetime.date(2019, 3, 11)”转换为 '11/03/2019'

如何将 Sybase ASE smalldatetime/datetime/bigdatetime 转换为标准格式

如何将 C# DateTime 转换为 MySQL 时间戳表列