提问者:小点点

HotspotJVM如何准确确定Linux(Centos)上的当前时区?


在Docker容器内运行的JVM实例中,当前时区未正确确定时,我遇到了问题(主机和容器都是OS6.5分)。

首先,我通过-v /etc/localtime:/etc/localtime: roetc/localtime映射到子容器(我认为这是一种流行的方式)

当我通过主机和容器上的SSH登录时

日期-u

打印Mon Apr 20 11:48:57UTC2015

日期

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

在JVM然而与

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

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

当前时区是如何准确确定的?

甲骨文FAQ没有透露,我不太明白JavaJava使用什么指标来获取当前用户的时区

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

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

更新:如果有人对变通方法感兴趣——我已经在斯蒂芬的回答中指定了TZ环境变量,所以现在容器是用参数创建的

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


共1个答案

匿名用户

根据此页面,在Linux上运行的JVM使用TZ环境变量为其提供本地时区的名称。

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

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