• 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后失效

    复制代码
    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)
    复制代码

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

    [mysqld] 之下添加
    default-time-zone=timezone
    来修改时区。如东八区:
    default-time-zone = '+8:00'
    重启mysql:
    $ service mysql start
  • 相关阅读:
    在Unity3D中开发的Hologram Shader
    在Unity3D中开发的Toon Shader
    在Unity3D中开发的Dissolve Shader
    2017.2.26
    2017.2.21
    2017.2.20
    2017.2.19
    2017.2.18
    2017.2.17<转>
    2017.2.16 linux
  • 原文地址:https://www.cnblogs.com/silyvin/p/10082443.html
Copyright © 2020-2023  润新知