mybatis从mysql数据库中取出的时间有时区问题
程序员文章站
2022-05-24 15:31:02
...
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());
}
这样前端得到的值就是正确的时区转换结果了。至于为什么,先挖个坑,有空来填。
上一篇: 泡屎都不行
下一篇: 成本控制依旧是厂商面临的最大挑战