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

如何将MySQL DATETIME转换为java.time.Instant并以系统默认时区显示给用户?,java,mysql,javafx,Java,Mysql,Javafx,我正在为学校做一个项目,我完全不知所措。背景如下: 我正在开发一个将在本地运行的JavaFX约会应用程序,因此我不需要担心服务器端时区与实际用户时间不同的后果。我不能使用任何第三方库。该应用程序目前使用一个日期选择器和两个组合框控件供用户输入日期、小时和分钟值。它们使用传统的get/set方法存储在约会对象的即时变量(start)中。我正在成功地从控件写入DB,结果如我所期望的那样出现。如果我选择2019年6月31日和12:00,然后将其写入数据库,它将显示在数据库中,并作为2019-12-31

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

我正在开发一个将在本地运行的JavaFX约会应用程序,因此我不需要担心服务器端时区与实际用户时间不同的后果。我不能使用任何第三方库。该应用程序目前使用一个日期选择器和两个组合框控件供用户输入日期、小时和分钟值。它们使用传统的get/set方法存储在约会对象的即时变量(start)中。我正在成功地从控件写入DB,结果如我所期望的那样出现。如果我选择2019年6月31日和12:00,然后将其写入数据库,它将显示在数据库中,并作为2019-12-31 17:00:00存储在开始列(数据类型为DATETIME)中。我在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

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

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

我无法投票,但这让我找到了正确的答案。看起来,我确实没有从DB中获得正确的时间。只需执行转换
Instant start=i_rs.getTimestamp(“start”).toInstant()
不足以将数据库检索到的时间适当地存储为一个瞬间,以及从数据库接收到的确切时间。它正在被转换<代码>即时启动=i_.getTimestamp(“启动”).toLocalDateTime().toInstant(ZoneOffset.UTC)