【发布时间】:2015-06-27 03:29:41
【问题描述】:
当在 Docker 容器(主机和容器都是 Cent OS 6.5)内运行的 JVM 实例中未正确确定当前时区时,我遇到了问题。
首先,我通过-v /etc/localtime:/etc/localtime:ro 将etc/localtime 映射到子容器(我认为它是prevalent way)
当我在主机和容器上通过 SSH 登录时
日期-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 SE 平台的时区数据 从本地或主机操作系统。 Java SE 平台 在本地安装维护一个私有时区数据存储库 文件 ( .../jre/lib/zi) 作为 Java 运行时环境 (JRE) 的一部分 软件。应用任何操作系统时区补丁(对于 例如 Solaris OS、Linux、Windows)将不会影响 Java SE 平台时区数据的准确性。
更新:如果有人对解决方法感兴趣 - 我在 Stephen 的回答中指定了 TZ 环境变量,所以现在容器是使用参数创建的
-v /etc/localtime:/etc/localtime:ro -e "TZ=Europe/Moscow"
【问题讨论】:
标签: java linux date jvm docker