解决使用若依框架,创建时间少了8小时。

问题:最近使用若依框架时,发现本地项目获取当前时间有一个问题,就是数据库的时间比当前时间少了八小时。

一开始以为在实体类中加上GMT+8,就可以解决,后来测试了发现还是存在该问题。

/** 创建时间 */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date createTime;

另外数据库源配置: GMT%2B8 意思就是 GMT+8

jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8

分析

按照 SpringBoot接口返回的数据时间与实际相差8小时问题排查 介绍的方法,分别测试容器、jvm 和 mysql 数据库的当前时间。项目的数据库连接使用了 serverTimezone=GMT%2B8,项目肯定是不会有问题的。

1. 容器或服务器的时间
# date
Thu 06 Apr 2023 06:06:54 PM CST

显示正常

2. 编写一个java应用查看jvm时间
import java.util.Date;

public class Demo {
   public static void main(String[] args) {
       Date date = new Date();
       System.out.println(date);
   }
}

服务器上创建一个 Demo.java 文件,javac Demo.java + java Demo 生成字节码并执行,时间也是正常的。

3. 查看数据库时间(大概率出现原因)

可以在服务器上连接mysql执行以下命令。

SELECT NOW();

show variables like '%time_zone%';

SELECT @@global.time_zone;

SELECT @@session.time_zone;

然后发现确实是数据库的问题,time_zone 变量为 SYSTEM,而 system_time_zone 为 UTC,所以 mysql 数据库的时区是有问题的,需要改成东八。

我这边服务器mysql使用docker安装的。mysql的conf配置挂载在宿主机器上,所以,只需要找到宿主机挂载mysqld.cnf文件修改配置即可。
可以参考 修改Docker容器中的mysql时区的三种方式

备注:记录一下修改docker安装的mysql配置文件。

1、运行docker ps 找到mysql容器。
2、执行docker exec -it 容器id /bin/bash 进入容器。
3、执行mysql -uroot -p 然后输入密码进入mysql。然后可以输入上面那些指令查看mysql的时区配置。
4、修改mysql配置文件。docker mysql重启。

你可能感兴趣的:(若依,项目,java,服务器,后端)