时区配置

在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

3、https://my.oschina.net/huawu/blog/4646

原文地址:https://www.cnblogs.com/victorfrost/p/10335018.html