mysql 5.7
mybatis 3.4.0
mysql-connector-java-6.0.6
表中有一个名为sent_datetime
的列,其类型为timestamp
:
有一条记录,sent_datetime
的值为:
我们可以看到它的值为2019-06-20 17:24:34
。
MySql位于另一台操作系统为centos 7的服务器中。
java bean是(我将sent_datetime
设置为java.util.Date
):
public class MailLog implements Serializable{
private static final long serialVersionUID = 7752106961960847185L;
private Date sent_datetime;
public Date getSent_datetime() {
return sent_datetime;
}
}
在dao
中,当我查询该记录并打印sent_datetime
值时:
MailLog log = mybatisTemplate.selectOne("getMailLog", mailLog);
System.out.println(log.getSent_datetime());
但是,它会打印 2019年6月21日星期五06:24:34 。是错的。
同时,如果CST
表示美国时间,应该是 20 ,不能是 21st ,对吧?
如果我在Java bean中将sent_datetime
设置为String
,那么它将打印正确的值。
不过,有些记录保存或显示不正确,有些记录是正确的。
为什么会这样?
在mysql中,我运行SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;
,它返回SYSTEM SYSTEM CST
。
答案 0 :(得分:1)
时间差异13h的原因是JDBC和MySQL连接器之间的时区定义不同。
CST有2个定义:
在这种情况下:
有关更多详细信息,您可以在com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer()
和com.mysql.cj.jdbc.PreparedStatement.setTimestamp()
中引用源代码
使用+08:00
代替CST
来解决此问题。
set global time_zone = '+08:00';
或
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&serverTimezone=Asia/Shanghai