的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,不能是21。如果我在Java bean中将
sent_datetime
设置为String
,则它将输出正确的值。不过,有些记录保存或显示不正确,有些则正确。
为什么会这样?
在mysql中,我运行
SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;
,它返回SYSTEM SYSTEM CST
。 最佳答案
时间差异13h的原因是JDBC和MySQL连接器之间的时区定义不同。
CST有2个定义:
美国中部标准时间UTC-05:00
中国标准时间UTC + 08:00
在这种情况下:
JDBC认为时区为CST-5
JBDC将时间戳+0传输到CST-5
MySQL认为时区为CST + 8,请将CST-5传输到Timestamp-13
有关更多详细信息,您可以在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
关于java - mybatis将时间戳转换为java日期是错误的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56788632/