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

标签 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());

但是,它会打印Fri Jun 21 06:24:34 CST 2019。这是错误的。

同时,如果 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 个定义:

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

在这种情况下:

  1. JDBC 认为时区是 CST-5
  2. JBDC 将 Timestamp+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

关于java - mybatis将时间戳转换为java日期是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56788632/

相关文章:

java - JButton 未在我的 JFrame 中绘制。 JFrame 处于 while 循环中

java - 在插入 Spring Hibernate 之前检查重复项

java - 对于 400 Bad Request 没有得到正确的错误信息

php - 如何在论坛页面中监控用户

php - 检索数据库 wordpress 中的序列化值

java - 如何在 Angular 中调用 Java HTTP POST 方法

java - 如何使用 MyBatis BlobInputStreamTypeHandler/ClobReaderTypeHandler 流式传输选择请求的内容?

java - 当我点击“运行”按钮时,我的 JFrame 不会显示,尽管 NetBeans 说它正在运行

php - 需要通过 PHP 将大型 CSV 文件导入多个 MySQL 表的时间高效方法

java - 使用 mybatis 保存/更新集合,常见的做法是什么?