我面临一个不寻常的问题。
在 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/