在linux中与时间相关的文件有
/etc/localtime
/etc/timezone ##RHEL 7中找不到该文件
其中,/etc/localtime是用来描述本机时间,而 /etc/timezone是用来描述本机所属的时区。
修改本机时区
rm -rf /etc/localtime ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
在/usr/share/zoneinfo下存放着不同时区格式的时间文件,执行以上命令,可以将本机时间调整至目标时区的时间格式。
Java读取的时区与本机date出来的时区不同
在Linux中,有一些程序会自己计算时间,不会直接采用带有时区的本机时间格式,会根据UTC时间和本机所属的时区等计算出当前的时间。
比如jdk应用,时区为“Etc/UTC”,本机时间改为北京时间,通过java代码中new 出来的时间还是utc时间。
Java在没有TZ环境变量时取的是 /etc/sysconfig/clock中的时时区。
Sun上面有和我这种情况相关的bug - Default timezone is incorrectly set occasionally on Linux(http://bugs.sun.com/view_bug.do?bug_id=6456628), 里面描述了java vm取的默认timezone的算法:
1)如有环境变量 TZ设置,则用TZ中设置的时区
2)在 /etc/sysconfig/clock文件中找 "ZONE"的值
3)如果2)都没,就用/etc/localtime 和 /usr/share/zoneinfo 下的时区文件进行匹配,如找到匹配的,就返回对应的路径和文件名。
参考:
1、https://www.cnblogs.com/mnstar/p/8567402.html
2、https://blog.csdn.net/gezilan/article/details/79422864