mysql查出时间相差14小时_mybatis查询mysql的datetime类型数据时间差了14小时(时区问题)...

https://blog.csdn.net/yjgithub/article/details/80404002

https://www.cnblogs.com/drizzlewithwind/p/6228001.html

背景:

centos 东8区 CST

mysql客户端ok,jdbctemplate写入ok

mybatis查询差14小时

mysql> show variables like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | CST |

| time_zone | SYSTEM |

+------------------+--------+

2 rows in set (0.02 sec)

mysql> select now();

+---------------------+

| now() |

+---------------------+

| 2016-12-27 22:29:59 |

+---------------------+

1 row in set (0.00 sec)

出错过程复盘:

现在开始调试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

就少14小时。这是因为:在解析成预编译语句的时候,误将CST(China Standard Time utc+8)解析成CST(Central Standard Tim UTC-6),美国中部标准时间,所以少14个小时。

个人推测:

jdbctemplate认为System 的timezone CST是China Standard Time,所以写入没错

mybatis的查询认为Central Standard Time,所以查询快了14小时

解决方案:

1. 命令修改(重启mysql后失效)

9b620d362b90cb5b995c35ed98732021.gif

mysql> set time_zone = '+8:00';

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%time_zone%';

+------------------+--------+

| Variable_name | Value |

+------------------+--------+

| system_time_zone | CST |

| time_zone | +08:00 |

+------------------+--------+

2 rows in set (0.04 sec)

0b43bcdbb43fc2f1480c003161ad5e07.gif

2. 修改配置文件my.cnf(在/etc/my.cnf或者/etc/mysql/my.cnf)

[mysqld] 之下添加

default-time-zone=timezone

来修改时区。如东八区:

default-time-zone = '+8:00'

重启mysql:

$ service mysql start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值