如果在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”
答案 0 :(得分:2)
根据this page,在Linux上运行的JVM使用TZ环境变量为其指定本地时区的名称。
该页继续解释TZ通常设置在" / etc / profile"中,如果使用不是&#t;#的机制启动Java,它就无法工作34;源"那个文件。
Oracle FAQ引用的时区数据有所不同。它是JVM用于从时区名称映射到相应区域偏移的数据(考虑夏令时调整等)。