1. 问题现象
最近发现某些服务器上运行的java程序选择的时区是Asia/Harbin
或Asia/Chungking
,而不是我们常见的Asia/Shanghai
。由此导致与外部对接方交互时因为时区不同而发生问题。
通过jinfo我们可以查看java程序使用的时区:
[root@centos6 ~]# jinfo 12104 | grep user.timezone
user.timezone = Asia/Harbin
让我们再来看看CentOS的时区:
[root@centos6 ~]# date +"%Z %::z"
CST +08:00:00
2. 原因分析
首先我们来看下Java程序是怎样取得时区信息的。通过Oracle的官方文档,我们可以知道其默认时区的获取方式:
- Use the user.timezone property value as the default time zone ID if it's available.
- Detect the platform time zone ID. The source of the platform time zone and ID mapping may vary with implementation.
- Use GMT as the last resort if the given or detected time zone ID is unknown.
我们可以写一个简单的程序来测试:
DefaultTimeZone.java
public class DefaultTimeZone {
public static void main(String[] args) {
System.out.println(java.util.TimeZone.getDefault()