在编写代码过程中,遇到一个问题,在服务器上写入时间为: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程序的时区即可