热点JVM如何精确确定Linux(Centos)上的当前时区?

在Docker容器内运行的JVM实例(主机和容器均为Cent OS 6.5)中当前时区未正确确定时,遇到问题。

首先我已经通过-v /etc/localtime:/etc/localtime:ro映射了etc/localtime到子容器-v /etc/localtime:/etc/localtime:ro (我认为这是一种普遍的方式 )

当我通过SSHlogin主机和容器

date-u

打印Mon Apr 20 11:48:57 UTC 2015

date

打印Mon Apr 20 14:50:41 MSK 2015

然而在JVM中

System.out.println(new Date());

我得到Mon Apr 20 11:52:24 UTC 2015内部容器和Mon Apr 20 14:53:17 MSK 2015主机内。

现在的时区是如何确定的?

Oracle常见问题解答并没有说明问题 ,我不太清楚Java使用什么指标来获取当前用户的时区

我的操作系统的时区修补程序是否修复了Java平台的时区数据?

不可以。Java SE平台的时区数据不从本地或主机操作系统读取。 Java SE平台作为Java Runtime Environment(JRE)软件的一部分,在本地安装的文件(… / jre / lib / zi)中维护时区数据的私有存储库。 应用任何操作系统时区补丁(例如Solaris OS,Linux,Windows)都不会影响Java SE平台时区数据的准确性。

更新:如果有人对解决方法感兴趣 – 我已经在Stephen的回答中指定了TZ环境variables,所以现在使用参数创build容器

-v / etc / localtime:/ etc / localtime:ro -e“TZ =欧洲/莫斯科”

根据这个页面 ,运行在Linux上的JVM使用TZ环境变量给它一个本地时区的名字。

页面继续解释TZ通常在“/ etc / profile”中设置,如果使用不“源”该文件的机制启动Java,它将不起作用。


Oracle FAQ引用的时区数据有所不同。 JVM用于从时区名称映射到相应的区域偏移(考虑夏令时调整等)的数据。