什么控制 WebLogic 中的时区到 GMT 偏移映射?

What controls timezone to GMT offset mapping in WebLogic?

我遇到了一个不寻常的问题。

部署在 Oracle WebLogic 生产环境中的应用程序开始出现错误。应该打印为 24 Mar 00:00:00 EDT 2020 的日期打印为 23 Mar 23:00:00 EST 2020

其他 WebLogic 服务器日志(不是来自我们的应用程序)也以 EST(东部标准时间)而不是 EDT(东部夏令时)打印。

这只发生在生产环境中。

应用程序转储到其日志中的时区在所有环境中都是正确的(即 "America/New_York")。我检查了两个环境中的 $JRE_HOME/lib/tzdb.dat 文件,它们是相同的。

有谁知道这可能是什么原因造成的?

JVM 默认时区设置已更改

这是一个猜测,但完全一致。使用时区缩写(EST 或 EDT)打印的日期和时间很可能使用 JVM 的默认时区。因此,默认时区的设置已在您的生产 WebLogic 服务器中更改。服务器中的任何程序 运行 都可以做到这一点。即使在同一个 JVM 中的 WebLogic 之外的程序 运行 也可以,如果有的话。随时。

默认时区是在启动时从系统 属性 user.timezone 设置的(或者 JVM 中的程序第一次对时区做任何事情,我不确定)。稍后更改 JVM 的默认时区 不会 在系统上恢复 属性。简要演示:

    System.setProperty("user.timezone", "America/New_York");

    TimeZone.setDefault(TimeZone.getTimeZone("America/Atikokan"));

    System.out.println("TimeZone.getDefault(): " + TimeZone.getDefault().getID());
    System.out.println("user.timezone: " + System.getProperty("user.timezone"));
    System.out.println("Example java.util.Date: " + new Date());

运行 我电脑上的这段代码给出了以下输出:

TimeZone.getDefault(): America/Atikokan
user.timezone: America/New_York
Example java.util.Date: Thu Mar 19 14:18:03 EST 2020

您注意到 user.timezone 打印为 America/New_York,但最后一行提到 EST,因此与 America/New_York 不一致,后者暗示 EDT如果我没记错的话

PS 通常我会完全不鼓励使用 TimeZone class,因为它设计不佳且早已过时。我在本次演示中需要它,因为 java.time,现代 Java 日期和时间 API,不提供更改 JVM 时区设置的选项(据我所知)。也许他们不包括它是明智的选择,因为 - 如您所见 - 这样做很容易引起混淆。