什么控制 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 时区设置的选项(据我所知)。也许他们不包括它是明智的选择,因为 - 如您所见 - 这样做很容易引起混淆。
我遇到了一个不寻常的问题。
部署在 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 时区设置的选项(据我所知)。也许他们不包括它是明智的选择,因为 - 如您所见 - 这样做很容易引起混淆。