如图

想查询4月1日到21日的记录,可是却连着3月31日的记录都查到了

到后端查看日志,显示查询开始日期为31日16时,那么基本断定是时区出了问题

那么有几种可能,一是系统时区,一是数据库时区,三是docker容器内部的时区

第一步,date -R查看系统时区输出Tue, 21 Apr 2020 09:31:18 +0800,东八区,没问题

那么第二步,查看数据库时区,登录mysql,show variables like "%time_zone%";

mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.01 sec)

跟随系统,也没问题,需要注意的是,如果mysql是部署在docker中的话,就要进入容器内部更改容器内部的时区了

保守起见,可以指定mysql的时区

set global time_zone = '+8:00';
set time_zone = '+8:00';
set time_zone = '+8:00';

再次查看mysql时区,已经改变了

mysql> show variables like "%time_zone%";
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | +08:00 |
+------------------+--------+
2 rows in set (0.00 sec)

一开始看了前面两个的时区后,发现都没问题,纳闷了好久,后来才想起服务是部署在docker的啊,于是输入docker exec -it 容器ID bash进入容器

输入date -R,显示Tue, 21 Apr 2020 01:40:28 +0000,终于找到原因了

于是输入cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime,却提示 cp: can't stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory,容器内部是没有这些时区文件的,那么就要从宿主机上面拷贝一份进来

首先mkdir -p /usr/share/zoneinfo/Asia创建文件夹

ctrl+D退出容器,执行docker cp /usr/share/zoneinfo/Asia/Shanghai d2e85b301fae:/usr/share/zoneinfo/Asia 再次进入容器,执行cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime即可

可以通过date -R进行验证,显示Tue, 21 Apr 2020 01:42:18 +0800,大功告成