SpringBoot接口返回的数据时间与实际相差8小时问题排查

  • A+
所属分类:fastjson Java

场景描述

部署了一个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

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: