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

时间:2018-02-11 22:10:43

标签: java mysql timestamp utc timezone-offset

回答:这个问题以不同的形式出现在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();  

这似乎应该有效。我还尝试创建一个ZonedDateTime设置为UTC,然后将其设置为当地时间,认为可能是因为java.sql.timestamp不包含可能需要的时区。这也行不通。

此时我非常乐意将时区偏移量存储在静态变量某处作为int值,然后只需执行ZonedDateTime.minus(ZoneOffsetNumber,minutes)或类似的东西以获得正确的本地时间但是我不知道如何查找并将其存储为int值。

它一直在UTC时间回来。它显示正确的时区名称,如美国/东方,但仍显示UTC时间。

我应该使用atInstant吗?我也无法做到这一点。

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

任何人都有这方面的经验吗?似乎以UTC格式存储在服务器上是最好的做法。我不知道为什么回到原来的时区是如此困难。

编辑:我在这里找到了这个坦克的回答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);

1 个答案:

答案 0 :(得分:1)

我找到了这个坦克的答案给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);