向数据库添加时间戳时,它将仅设置当前时间,而忽略值

问题描述

因此,我试图将时间戳保存到数据库中,但是由于某种原因添加时间戳时,它将设置当前时间,而忽略timestamp变量的值。 代码

try (PreparedStatement statement = connection.prepareStatement("INSERT INTO joinMoment (userId,moment) VALUES (?,?);")) {
   statement.setString(1,id);
   System.out.println("DBTimeStamp: " + timestamp);
   statement.setTimestamp(2,timestamp);
   statement.executeUpdate();
}

调试消息会打印正确的时间:DBTimeStamp:2020-09-11 19:53:20.454 但是添加数据库的是:2020-09-11 17:53:20(添加时的当前时间)

解决方法

整数小时或半小时的时间差异表示时区混乱

如果使用此查询而不是问题中的查询,则不必将时间戳发送到数据库服务器。它将为您处理所有事情。

INSERT INTO joinMoment (userId,moment) VALUES (?,NOW() );

如果您的moment列是TIMESTAMP,它将收到UTC时间。当您检索它时,MySQL会将其从UTC转换为连接或服务器的enter image description here中的时间。

如果它是DATETIME列,它将接收连接或服务器所在时区的本地时间。

如果确实要将时间戳从Java程序发送到服务器,请记住这一点:Java程序的本地时区应设置为与MySQL连接或服务器时区相同。如果要发送服务器UTC时间戳,请首先发出此SQL命令以设置连接上的时区。

SET time_zone = 'UTC';

如果您不这样做,MySQL将无助于您转换时区。

TIMESTAMPDATETIME之间的区别是MySQL特有的。其他品牌和型号的表服务器以其他方式处理这些问题。

如果要存储这些毫秒,请将moment列声明为TIMEZONE(3)DATETIME(3)

,

我假设您居住在世界标准时间+2.00的国家/地区 因此,您需要先转换时间戳,然后再存储

您可以参考此链接-> Convert UTC java.sql.Time to java.time.localtime with correct DST