gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:23:41 26 4
gpt4 key购买 nike

已解答:这个问题以不同的形式出现在 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, 分钟) 或类似的操作即可获得正确的本地时间,但是我不知道如何查找并将其存储为 int 值。

它总是以 UTC 时间返回。它显示正确的时区名称,例如美国/东部,但仍显示 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);

最佳答案

我在这里找到了阿卜杜勒哈菲德答案的答案: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);

关于java - 将 UTC 时间从 MySQL 转换为本地时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737018/

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