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

时间:2019-06-27 10:01:55

标签: java mysql mybatis

mysql 5.7

mybatis 3.4.0

mysql-connector-java-6.0.6

表中有一个名为sent_datetime的列,其类型为timestamp

enter image description here

有一条记录,sent_datetime的值为:

enter image description here

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

1 个答案:

答案 0 :(得分:1)

时间差异13h的原因是JDBC和MySQL连接器之间的时区定义不同。

CST有2个定义:

  1. 美国中部标准时间UTC-05:00
  2. 中国标准时间UTC + 08:00

在这种情况下:

  1. JDBC认为时区为CST-5
  2. JBDC将时间戳+0传输到CST-5
  3. 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