问题描述
数据库里时间和查出的时间相差8小时。
排查过程
可能涉及到的排查位置:
1、linux服务器时区
2、mysql时区
3、mysql连接配置时区
4、实体类中转时区
一、linux服务器时区
输入date -R,检查时区

时区为东八区,没问题
二、mysql时区
查看mysql时区 show variables like '%time_zone%'
发现时区设置为UTC

修改过程
由于此项目使用docker部署,所以需要先寻找Mysql配置文件所在的位置,然后在其中添加time_zone = +08:00

查询Mysql配置文件所在位置
在Docker容器中,MySQL的配置文件通常位于容器的文件系统中。您可以通过Docker命令访问这个文件,然后进行修改。
如何在Docker容器中找到MySQL的配置文件并修改:
-
查找MySQL容器的ID:首先,使用
docker ps
命令找到正在运行的MySQL容器的ID。
docker ps
这将显示所有正在运行的容器,包括MySQL容器的ID。
-
进入MySQL容器:使用
docker exec
命令进入MySQL容器。
docker exec -it <container_id> bash
将
<container_id>
替换为您在步骤1中找到的MySQL容器的ID。-
查找MySQL配置文件:在MySQL容器内部,使用
find
命令查找my.cnf
或my.ini
文件。
find / -name my.cnf 或者 find / -name my.ini
这将搜索容器内的文件系统,并找到MySQL配置文件。
-
修改配置文件:使用文本编辑器(如
nano
或vim
)打开找到的配置文件。
vim /path/to/my.cnf #此步骤应该在容器外执行,在大多数Linux系统中,可以通过按下Ctrl+P然后按q来退出当前的命令行界面。 #也可以使用 exit 命令 #如果容器内没有vim, 应该在容器内安装vim, 此步骤应该在容器外执行 docker exec -it <container_id> apt-get update docker exec -it <container_id> apt-get install vim #安装完成后就可以使用docker exec来命令来编辑配置文件了 docker exec -it <container_id> vim /etc/mysql/my.cnf
将
/path/to/my.cnf
替换为配置文件的实际路径。设置MySQL服务器的时区:
-
打开MySQL服务器的配置文件。对于MySQL 5.7和8.0,通常是
my.cnf
或my.ini
。对于MySQL 8.0,您可能需要使用my.ini
。 -
在配置文件中,找到
[mysqld]
部分,或者创建一个新部分。 -
在
[mysqld]
部分中,添加或修改time_zone
选项,如下所示:
[mysqld]time_zone = +08:00
或者,如果您使用的是MySQL 8.0,您可能需要使用
default_time_zone
选项:[mysqld]default_time_zone = +08:00
保存配置文件并重启MySQL服务以应用新的时区设置。
保存并退出编辑器:编辑完配置文件后,保存并退出编辑器。
-
重启MySQL服务:在MySQL容器内部,使用以下命令重启MySQL服务。
service mysql restart
或者,如果您使用的是MySQL 5.7或更高版本,可以使用以下命令:
systemctl restart mysqld
验证时区设置:再次进入MySQL容器,并使用之前的SQL命令验证时区设置是否已更改。
SELECT @@global.time_zone, @@session.time_zone;
或者,对于MySQL 8.0:
SELECT @@global.default_time_zone, @@session.time_zone;
这将显示服务器的全局时区和会话时区设置。
请注意,如果您使用的是MySQL 8.0,
default_time_zone
选项是新的,并且用于全局时区设置。对于MySQL 5.7和更早的版本,您应该使用time_zone
选项。三、检查mysql连接配置是不是没有加serverTimezone
datasource: url: jdbc:mysql://localhost:3306/classmate-info?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver
四、检查实体类中转时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss" , timezone = "GMT+8") private Date date;