问题描述
现在有一个SpringBoot
项目部署到Linux
服务器。Linux
上有一个MySQL
数据库,里面保存的数据有时间,类型为datetime
。
在通过接口读取MySQL
数据库中的数据时,读取出来的数据时间比实际存储的数据时间提前了8个小时。
问题排查
查了很多资料,就不详细写排查过程了。这里直接列出可能出问题的地方:
- SpringBoot中Jackson库的时区
- JVM时区
- SpringBoot URL时区
- Linux上MySQL数据库的时区
- Linux操作系统的时区
最好保证这几个时区统一都是东八区,即:Asia/Shanghai
或 GMT%2B8
或 +08:00
。
我这里的出问题的原因就属于第一种。SpringBoot
接口在返回json
数据的时候,底层会调用Jackson
库将结果序列化为json
字符串。而Jackson
库默认又是采用GMT
时区对对象中的date
字段进行序列化的,但我们属于东八区,即GMT+8
,所以就导致了上面的问题。
解决方案
在要返回的类中,在时间字段上加一个注解,如下;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date date;