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

时间:2015-04-20 12:00:32

标签: java linux date jvm docker

如果在Docker容器内运行的JVM实例中未正确确定当前时区(主机和容器都是Cent OS 6.5),则会出现问题。

首先,我通过etc/localtime-v /etc/localtime:/etc/localtime:ro映射到子容器(我认为这是一个prevalent way

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

  

date -u

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

  

日期

打印 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 FAQ没有说清楚,我不太明白Java用Java来为当前用户获取时区的指标

  

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

     

没有。不读取Java SE平台的时区数据   来自本地或主机操作系统。 Java SE平台   维护本地安装的时区数据的私有存储库   文件(... / jre / lib / zi)作为Java运行时环境(JRE)的一部分   软件。应用任何操作系统时区补丁(for   示例Solaris OS,Linux,Windows)对此没有影响   Java SE平台时区数据的准确性。

更新:如果有人对解决方法感兴趣 - 我已经在Stephen的答案中指定了TZ环境变量,那么现在使用参数创建容器

  

-v / etc / localtime:/ etc / localtime:ro -e“TZ = Europe / Moscow”

1 个答案:

答案 0 :(得分:2)

根据this page,在Linux上运行的JVM使用TZ环境变量为其指定本地时区的名称。

该页继续解释TZ通常设置在" / etc / profile"中,如果使用不是&#t;#的机制启动Java,它就无法工作34;源"那个文件。


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