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

标签 java date weblogic dst

我面临一个不寻常的问题。

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

其他 WebLogic 服务器日志(不是来 self 们的应用程序)也以 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 类,因为它设计得很糟糕并且已经过时了。我需要它来进行演示,因为现代 Java 日期和时间 API java.time 不提供更改 JVM 时区设置的选项(据我所知)。也许他们做出了明智的选择,不包括它,因为 - 正如你所看到的 - 这样做很容易引起困惑。

关于java - WebLogic 中什么控制时区到 GMT 偏移映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761165/

相关文章:

java - JScrollPane 中的 GridBagLayout 无法正确调整大小

java - 如何正确地将格式化的日期时间传递到 HTTP 请求中?

javascript - 获取随机日期为 "yyyy-mm-dd"格式的 Javascript

Java-毫秒 (SSS) 未使用 SimpleDateFormat 进行解析

java - 关于weblogic portlets功效的一个问题

java - 是否有使用不同应用服务器测试应用程序的技巧或最佳实践?

java - 如何将拥有的域名从 aws route 53 绑定(bind)到 jelastic URL

java - 在Java中如何将字符串转换为整数?

Git:列出 git 分支,按(并显示)日期排序

java - 在 WebLogic 上运行具有 SSL 安全性的 JAX-WS 服务