java中关于时区的问题:springboot 环境中经常发现java.util.Date, java.time.LocalDateTime获取到的系统当前时间会少八个小时

操作系统:CentOS Linux release 7.9.2009 (Core)
java version “1.8.0_271”

现象:springboot环境部署中经常会发现java.util.Date, java.time.LocalDateTime获取到的系统当前时间会少八个小时。有些服务器部署正常,有些异常。

去检查这个异常服务器上java应用的jdk系统变量会发现user.timezone=GMT
在这里插入图片描述

jdk8检查命令: #jinfo [pid]|grep timezone
pid在linux系统中可以通过ps进程命令或jps命令获取

但是在正常的环境中查看这个变量一般是user.timezone=Asia/Shanghai 或user.timezone = GMT+08。
Asia/Shanghai和GMT+08一样都代表东八区区时。
user.timezone=Asia/Shanghai
user.timezone = GMT+08

有了这个发现就好办了,解决java时区问题有两个思路,1手动指定jdk时区,2搞明白jdk获取时区的方法。
第一种思路是可以在服务启动时传参指定时区 java -jar -Duser.timezone=GMT+08 myApp.jar
第二种需要研究下jdk系统变量是怎么获取系统时区的,网上早有人研究过openjdk相关的源码传送门,拉到最后直接看结论

在Linux系统上,jvm获取时区系统变量大概过程:
1.先找“TZ”变量,没有,到2,
2.读/etc/timezone,没有到3,
3.比较/etc/localtime文件与"/usr/share/zoneinfo目录下所有时区文件,如果有一致的,就为该时区,如果没有,到4,
4.默认为标准GMT

知道了这个步骤,这里又找到了一篇文章

一个简单的方案是配置一个TZ系统环境变量。执行命令如下

echo "export TZ='Asia/Shanghai'" >> /etc/profile  && . /etc/profile

然后重启java应用,使用JDK的 jinfo [pid] | grep timezone 命令查看时区修改是否生效

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值