mybatis查询mysql的datetime类型数据时间差了14小时
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
mybatis查询mysql的datetime类型数据时间差了14⼩时
今天使⽤mybatis查询mysql中的数据时,莫名其妙的所有时间都出错了,所有时间都⽐数据库时间多了14⼩时,考虑了⼀下,初步判定是系统时区的问题。
因为mysql时区设置默认是操作系统时区,查看了下centos时区,东8区没有错,所以可以判定是代码⾥⾯设置了⼀个错误的时区。
现在开始调试mybatis源码,调试到mysql-connector-java-6.0.4.jar包的com.mysql.cj.jdbc.io.JdbcTimestampValueFactory的createFromTimestamp⽅法时,发现mysql的底层驱动程序对从数据库查询出来的时间⽤了⼀个Calender做类型转换,Calender记录中包含的时区为CST,跟中国的时区Asia/Shanghai正好差了14⼩时。
那么为什么mybatis连接数据库会使⽤CST的美国时间呢?继续查看源码发现
mysql连接数据库的时候会从mysql读取系统的时区设置,调试com.mysql.cj.mysqla.MysqlaSession.java的configureTimezone⽅法发
现,this.getServerVariable("system_time_zone")从系统⾥⾯读出来的时区设置是CST
⾄此问题已经清楚了,是mysql设置的时区不对,登陆linux,执⾏mysql -uroot -p, 然后运⾏命令show variables like '%time_zone%',发现system_time_zone项果然是CST。
⾄此,排查问题结束,修改⼀下mysql的时区设置即可。