在编写代码过程中,遇到一个问题,在服务器上写入时间为:2021-09-22 08:00:00,但在本机测试写入的时间为:2021-09-22 00:00:00

首先是怀疑服务器上的时间不正确,但经验证后发现不是:

$ date

# Output:Thu Sep 23 10:40:09 CST 2021  // 显示的是当前时间
# 以下是解决办法:
$ yum install ntpdate -y
$ ntpdate 0.asia.pool.ntp.org

其次怀疑服务器连接参数serverTimezone写错了,但实际上没有写错:

serverTimezone=GMT%2B8

查询资料过程中,发现了一个易错的地方,即前端取时间可能会少了8小时,通过以下代码解决:

spring:
    #解决前端取回日期少8个小时问题
    jackson:
        date-format: yyyy/MM/dd HH:mm:ss
        time-zone: GMT+8

然后,通过设置Java程序的时区解决了问题,在SpringBoot启动类中添加设置时区的方法:

@SpringBootApplication
public class Application {
    @PostConstruct
    void init() {
        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
    }
    public static void main(String[] args) {
        SpringApplication.run(MallApplication.class, args);
    }
}

最后,在查找具体原因的时候发现,由于代码是部署在Docker容器中,而Docker容器中的时区是不正确的,如:

$ date
# Output:Thu Sep 23 03:13:55 UTC 2021  // 使用了UTC的时间

由于不想在容器中同步时间,所以使用设置Java程序的时区即可