我有一个配置了两个用户的linux机器。我还有这段Java代码:
long time = System.currentTimeMillis();
String millis = Long.toString(time);
Date date = new Date(time);
System.out.println("Current time in milliseconds = " + millis + " => " + date.toString());
TimeZone tz = TimeZone.getDefault();
System.out.println("Current time zone: " + TimeZone.getDefault().getID());
如果我在bash上运行date
,我对两个用户都有相同的结果:
$ date
Fri Mar 22 10:02:58 PYST 2013
用户2:$ date
Fri Mar 22 10:03:22 PYST 2013
但是,如果我运行相同的java代码,我有:
用户1:$ java TimeTest
Current time in milliseconds = 1363957432669 => Fri Mar 22 10:03:52 PYST 2013
Current time zone: America/Asuncion
用户2:$ java TimeTest
Current time in milliseconds = 1363957456954 => Fri Mar 22 13:04:16 GMT 2013
Current time zone: GMT
所以我猜这与java为每个用户配置的方式有关。
我检查了定义的TZ
环境变量,但是没有为任何用户定义的 TZ
。
关于为什么我在同一Linux机器上为不同的用户获得不同的TimeZone.getDefault()
值的任何想法?
$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
发行版:
$ cat /etc/issue
Red Hat Enterprise Linux Server release 5.8 (Tikanga)
这可能与用户的Locale有关。
检查这些变量:http://linux.die.net/man/1/locale
两个机器的类似问题/解决方案:
- 两台linux机器设置为
UTC
- 一个JVM报告不正确的时区(如
CET
) - 其他报告正确
UTC
问题可能是:
- 故障机器的符号链接:
/etc/localtime -> /usr/share/zoneinfo/Europe/Paris
-
/usr/share/zoneinfo/Europe/Paris
包含UTC
信息
原因可能是一个简单的cp /usr/share/zoneinfo/UTC /etc/localtime
替换/usr/share/zoneinfo/Europe/Paris
的内容,而不是覆盖/etc/localtime
,这是一个符号链接,而不是一个文件!