mybatis从mysql数据库中取出的时间有时区问题

1、问题描述

最近遇到了一个小问题,就是从数据库中取出的时间总是和数据库中存储的时间有误差,总是相差8个小时。

2、排查

2.1数据库时区设定

看了好多博客,说是时区设定的问题。我在连接数据库时也没有做太多设定,就直接写的

spring.datasource.url=jdbc:mysql://localhost:3306/guest?serverTimezone=UTC

然后根据 mybatis查询mysql的datetime类型数据时间差了14小时(时区问题) 查看修改,使用如下指令

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

将数据库的时区设置加八个小时,如图
数据库时区设置结果
然而并不能解决我的问题。
又查看到[Mybatis] 读取数据库时间出现时间差这篇文章,觉得说得好像有点道理,因此我又将properties设置成为如下的样子

spring.datasource.url=jdbc:mysql://localhost:3306/guest?serverTimezone=UTC?useTimezone=true&serverTimezone=GMT%2B8

然而依然不起作用。

2.2 程序

既然到这里还不能解决,那就只能排查程序了。
排查实体类的时候,我突然发现我使用了JsonFormat注解,点进去发现还要设置时区,否则的话就是使用默认时区UTC

     /**
     * {@link java.util.TimeZone} to use for serialization (if needed).
     * Special value of {@link #DEFAULT_TIMEZONE}
     * can be used to mean "just use the default", where default is specified
     * by the serialization context, which in turn defaults to system
     * default (UTC) unless explicitly set to another timezone.
     */
    public String timezone() default DEFAULT_TIMEZONE;

所以我立马就将注解加上时区,改为

 @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8")
 private Date endTime;

Thanks God! 终于好了

备注

后来我还发现,即使你的时区是错误的,当时当你转换到前端显示的时候,会自动转换为正确的时间:

 @GetMapping("/getAll")
 public ResponseEntity<List<User>> getAllGuest(){
     return ResponseEntity.ok(managerService.getAllGuest());
 }

这样前端得到的值就是正确的时区转换结果了。至于为什么,先挖个坑,有空来填。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章