java - mybatis将时间戳转换为java日期是错误的
问题描述
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());
但是,它会打印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
.
解决方案
time diff 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
推荐阅读
- node.js - MongoDB 更改流 - 错误 [ERR_HTTP_HEADERS_SENT]
- java - 如何在android上统一共享内存?
- jenkins - Office365ConnectorSend 管道步骤不起作用
- angular - 如何以反应形式从嵌套组中获取价值?
- r - 根据其他人的情况创建新列
- sql-server - 从命令行运行 SSIS 例程的问题
- python - 当 arg 已经包含 " " 和 ' ' 引号时,如何将字符串 arg 提交给 subprocess.run(arg, shell=True)?
- excel - 单击时如何制作用“组”字填充单元格以用于下一个空行的按钮宏
- php - else 条件有效,即使为真
- python - nn.Linear 如何在 shape(batch_size, seq_length, hidden_size) 中工作?