【问题标题】:How does Hotspot JVM determine exactly the current timezone on Linux(Centos)?Hotspot JVM 如何准确确定 Linux(Centos) 上的当前时区?
【发布时间】:2015-06-27 03:29:41
【问题描述】:

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

首先,我通过-v /etc/localtime:/etc/localtime:roetc/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


    【解决方案1】:

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

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


    Oracle 常见问题解答中提到的时区数据有所不同。它是 JVM 用来从时区名称映射到相应区域偏移量的数据(考虑到夏令时调整等)。

    【讨论】:

    • 是的 - 设置 TZ 有效,但是当没有设置 TZ 时为什么时间不同是个谜 - 我会在空闲时间尝试检查 TimeZone.setDefaultZone()。
    • 我想 TZ 是在主机上设置的,而不是在容器中设置的,如果 TZ 未设置,JVM 的行为是假设 UTC。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2023-04-04
    • 2017-05-06
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多