解决从数据库中读取的时间与时间存储的时间不一致的问题

问题描述
数据库里时间和查出的时间相差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的配置文件并修改:
  1. 查找MySQL容器的ID:首先,使用docker ps命令找到正在运行的MySQL容器的ID。
docker ps
这将显示所有正在运行的容器,包括MySQL容器的ID。
  1. 进入MySQL容器:使用docker exec命令进入MySQL容器。
docker exec -it <container_id> bash
<container_id>替换为您在步骤1中找到的MySQL容器的ID。
  1. 查找MySQL配置文件:在MySQL容器内部,使用find命令查找my.cnfmy.ini文件。
find / -name my.cnf
或者
find / -name my.ini
这将搜索容器内的文件系统,并找到MySQL配置文件。
  1. 修改配置文件:使用文本编辑器(如nanovim)打开找到的配置文件。
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服务器的时区:
  1. 打开MySQL服务器的配置文件。对于MySQL 5.7和8.0,通常是my.cnfmy.ini。对于MySQL 8.0,您可能需要使用my.ini
  2. 在配置文件中,找到[mysqld]部分,或者创建一个新部分。
  3. [mysqld]部分中,添加或修改time_zone选项,如下所示:
[mysqld]time_zone = +08:00
 
或者,如果您使用的是MySQL 8.0,您可能需要使用default_time_zone选项:
[mysqld]default_time_zone = +08:00
保存配置文件并重启MySQL服务以应用新的时区设置。
 
 
保存并退出编辑器:编辑完配置文件后,保存并退出编辑器。
  1. 重启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;

 

点赞

当前页面评论已关闭。

隐藏
变装