问题描述:
今天启动java程序时,发现程序使用的US/East-Indiana时区。初步判断原因是debian系统刚安装时使用US时区进行安装,导致系统的默认时区不是东八区。
解决流程
-
首先修改/etc/localtime值为CST-8,然后使用linux命令date,发现时间已经是东八区时间。
-
然后重启java程序,但是程序中依然使用US/East-Indiana时区。
-
有点奇怪,猜测可能是java的启动时,传入的环境变量有问题,通过jps和jinfo获取当前进程的环境里时区的值 执行jps获取当前进程的进程id为13477:
/usr/lib/jvm/jdk1.8.0_144/bin/jps -v 13477 jar -Xmx384m -Xms128m -Dlogging.level.root=info然后通过jinfo获取当前进程中时区的值,发现依然是US/East-Indiana
/usr/lib/jvm/jdk1.8.0_144/bin/jinfo 13477 ... user.timezone = US/East-Indiana ... -
在网络上搜索这个问题,网上大部分解决方案是修改/etc/sysconfig/clock值,但是修改后不能解决我的问题。最后终于发现解决问题方法,修改/etc/timezone:
Asia/Shanghai -
重启java程序,问题解决
原因分析
在debian和ubuntu系统中,/etc/localtime和/etc/timezone配置的时区如果不一致时,Java程序只会从/etc/timezone中读取默认时区。
我刚开始只修改/etc/localtime为东八区,而/etc/timezone还是US/East-Indiana,则这两个文件表示的时区不一致了,所有java启动时就使用US/East-Indiana时区。只要保证这两个文件的时区相同,就可以解决问题