将 UTC 时间从 MySQL 转换为本地时区

Converting UTC time from MySQL to Local TimeZone

已回答:这个问题以不同的形式出现在 styackoverflow 上,我已经能够很好地利用其中的一些答案。但在这一点上,即使是以前回答过的问题,似乎也没有任何效果。这个问题看起来应该很简单,我真的很茫然。

我有一个项目(约会日历),其中需要将日期时间存储在 MySQL 中,然后在本地计算机上以正确的时区时间显示,无论从何处查看。要做到这一点,我觉得最简单的方法是以 UTC 格式存储时间。因此,无论在何处创建约会,开始和结束时间都会在客户端转换为 UTC,然后存储在数据库中。到目前为止,一切都很好。我能够使用此代码完成此操作。 DateTimePermissive 特定于我正在使用的选择器

LocalDateTime st = start.getDateTimePermissive();  
ZonedDateTime stz = st.atZone(ZoneId.systemDefault());
ZonedDateTime stzUTC = stz.withZoneSameInstant(ZoneId.of("UTC"));
java.sql.Timestamp startTime = Timestamp.valueOf(stzUTC.toLocalDateTime());

LocalDateTime et = end.getDateTimePermissive();
ZonedDateTime etz = st.atZone(ZoneId.systemDefault());
ZonedDateTime etzUTC = etz.withZoneSameInstant(ZoneId.of("UTC"));
java.sql.Timestamp endTime = Timestamp.valueOf(etzUTC.toLocalDateTime());

我 运行 遇到麻烦的地方是从另一个方向回来。我已经尝试了各种其他方法来做到这一点,但似乎无法让任何工作正常进行,即使我觉得我的代码是正确的。这是我现在正在尝试的方法。

java.sql.Timestamp st = apptRecords.getTimestamp("start");
LocalDateTime stld = st.toLocalDateTime();
ZonedDateTime startTime = stld.atZone(ZoneId.systemDefault());
//String startTimeConverted = startTime.toString();

java.sql.Timestamp et = apptRecords.getTimestamp("end");
LocalDateTime etld = et.toLocalDateTime();
ZonedDateTime endTime = etld.atZone(ZoneId.systemDefault());
//String endTimeConverted = endTime.toString();  

看来这应该行得通。我还尝试创建一个设置为 UTC 的 ZonedDateTime,然后也将其设置为当地时间,我想这可能是因为 java.sql.timestamp 不包含可能需要的时区。那也没用。

在这一点上,我非常乐意将时区偏移量作为 int 值存储在某个静态变量中,然后只需执行 ZonedDateTime.minus(ZoneOffsetNumber, minutes) 或类似的操作即可获得正确的当地时间,但我不知道如何找到它并将其存储为 int 值。

它只是在 UTC 时间不断返回。它显示正确的时区名称,如 American/Eastern 但它仍然显示 UTC 时间。

我应该使用 atInstant 吗?我也无法让它工作。

这是一个学校项目,不允许我更改 MySQL 中的任何变量类型。这些特定的是日期时间。

有人有这方面的经验吗?对于这样的事情,似乎以 UTC 格式存储在服务器上是最佳实践。想不明白为什么回到原来的时区这么难

编辑:我在这里找到了阿卜杜勒哈菲德的回答的答案:Is java.sql.Timestamp timezone specific?

通过将他提到的连接属性添加到连接属性中

useTimezone=true
useLegacyDatetimeCode=false
serverTimezone=UTC

无论我从哪个时区登录,时间都会转换为正确的时间。

因此,如果其他人对此有疑问,请在这里回答。像这样设置你的连接器

Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "");
props.setProperty("useTimezone", "true");
props.setProperty("useLegacyDatetimeCode", "false");
props.setProperty("serverTimezone", "UTC");
Connection con = DriverManager.getConnection(conString, props);

我在这里找到了 Abdelhafid 回答的答案:Is java.sql.Timestamp timezone specific?

通过将他提到的连接属性添加到连接属性中

useTimezone=true
useLegacyDatetimeCode=false
serverTimezone=UTC

无论我从哪个时区登录,时间都会转换为正确的时间。

因此,如果其他人对此有疑问,请在这里回答。像这样设置你的连接器

Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "");
props.setProperty("useTimezone", "true");
props.setProperty("useLegacyDatetimeCode", "false");
props.setProperty("serverTimezone", "UTC");
Connection con = DriverManager.getConnection(conString, props);