SpringBoot接口返回的数据时间与实际相差8小时问题排查方式
作者:不会画画的画师
文章描述了在部署SpringBoot应用到容器中时遇到请求接口返回时间与实际相差8小时的问题,并详细分析了可能的原因及具体的排查步骤和解决方案,总结指出,环境初始时区未配置是根本原因,建议在应用部署前配置好时区
SpringBoot接口返回的数据时间与实际相差8小时问题
场景描述
部署了一个SpringBoot应用在容器中,请求一个接口,接口返回的时间与实际相差8小时。
可能原因
1、容器的时区与实际时区相差差8小时
2、jvm时区与实际时区相差8小时
3、存入数据库后的时间相差8小时
4、后端获取的时间一致,但返回给前端后相差8小时
排查步骤
1、进入容器查看时间
$ date
2、编写一个java应用查看jvm时间
import java.util.Date; public class Demo { public static void main(String[] args) { Date date = new Date(); System.out.println(date); } }
3、查看数据库时间
打开数据库,查看数据库中存储的数据库时间是否与实际一致
4、在后台打印出后端获取到的数据的时间,是否与前端一致
解决方案
容器时区与实际时区相差8小时:
如果排查第一步获取到的时间与实际时间相差8小时,建议在容器的Dockerfile中添加以下内容:
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime RUN echo 'Asia/Shanghai' >/etc/timezone
jvm时区与实际时区相差8小时:
如果排查第二步获取到的时间与实际时间相差8小时,可以在SpringBoot的面向切面上或者main类上加以下代码
@PostConstruct void started() { TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); }
存入数据库的时间与实际时区相差8小时:
如果排查第三步获取到的时间与实际时间相差8小时,可以在SpringBoot应用配置文件application.yml修改数据库连接信息,url末尾添加serverTimeZone=GMT%2b8
Spring的json构造器导致时区不一致:
以上三种情况的根本原因是由于环境初始的时区未配置,最佳方案就是在应用部署前就配置好各自的时区。
排查第四步出现时区不一致,是spring的json构造器的时区与实际的不一致。
可以修改springboot配置文件application.yml,添加以下内容:
spring: jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。