mybatis转换时间戳为java日期错误
mybatis convert timestamp to java date is wrong
mysql 5.7
mybatis 3.4.0
mysql-连接器-java-6.0.6
在 table 中有一个名为 sent_datetime
的列,而 ose 类型是 timestamp
:
有一条记录sent_datetime
的值为:
我们可以看到它的值为2019-06-20 17:24:34
.
MySql 在另一台服务器 whose os 是 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
表示美国时间,它应该是20th,不能是21st,对吗?
如果我在 java bean 中将 sent_datetime
设置为 String
,那么它会打印正确的值。
不过,有些记录保存或显示不正确,有些是正确的。
为什么会这样?
在mysql,我运行SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;
,它returnsSYSTEM SYSTEM CST
.
时间差异 13h 的原因是 JDBC 和 MySQL 连接器之间的时区定义差异。
CST 有 2 个定义:
- 中部标准时间(美国)UTC-05:00
- 中国标准时间 UTC+08:00
在这种情况下:
- JDBC 认为时区是 CST-5
- JBDC 将 Timestamp+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
mysql 5.7
mybatis 3.4.0
mysql-连接器-java-6.0.6
在 table 中有一个名为 sent_datetime
的列,而 ose 类型是 timestamp
:
有一条记录sent_datetime
的值为:
我们可以看到它的值为2019-06-20 17:24:34
.
MySql 在另一台服务器 whose os 是 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
表示美国时间,它应该是20th,不能是21st,对吗?
如果我在 java bean 中将 sent_datetime
设置为 String
,那么它会打印正确的值。
不过,有些记录保存或显示不正确,有些是正确的。
为什么会这样?
在mysql,我运行SELECT @@global.time_zone, @@session.time_zone, @@system_time_zone;
,它returnsSYSTEM SYSTEM CST
.
时间差异 13h 的原因是 JDBC 和 MySQL 连接器之间的时区定义差异。
CST 有 2 个定义:
- 中部标准时间(美国)UTC-05:00
- 中国标准时间 UTC+08:00
在这种情况下:
- JDBC 认为时区是 CST-5
- JBDC 将 Timestamp+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