的MySQL 5.7

mybatis 3.4.0

mysql-connector-java-6.0.6

表的类型为sent_datetime的列名为timestamp

java - mybatis将时间戳转换为java日期是错误的-LMLPHP

有一条记录,sent_datetime的值为:

java - mybatis将时间戳转换为java日期是错误的-LMLPHP

我们可以看到它的值是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/

10-10 08:09