现象
SpringBoot打包的jar包部署后,发现日志中打印的时间正好与正确的时间相差了8小时,猜想是时区不对,在linux服务中使用date -R
命令查看获得linux的时间是正常的,时区也是+0800,在java启动类内打印new Date()
,结果是错误的
解决
1. 查看时区文件/etc/localtime
查看该文件的链接是指向哪个时区,我的是../usr/share/zoneinfo/UTC
,问题就出在这里,我们需要的是上海时区,可执行
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
命令修改时区
2.添加启动参数-Duser.timezone=GMT+08
不管linux环境如何,在启动jar包时加入该参数强行指定时区,完整示例:
java -jar -Duser.timezone=GMT+08 myservice-0.0.1-SNAPSHOT.jar --server.port=8086
3.在SpringBoot启动类内添加如下代码
@PostConstruct
void setDefaultTimezone() {
TimeZone.setDefault(TimeZone.getTimeZone( "Asia/Shanghai" ));
// TimeZone.setDefault(TimeZone.getTimeZone("GMT+8")); // 用这个也行
}