什么控制 WebLogic 中的时区到 GMT 偏移映射?
Posted
技术标签:
【中文标题】什么控制 WebLogic 中的时区到 GMT 偏移映射?【英文标题】:What controls timezone to GMT offset mapping in WebLogic? 【发布时间】:2020-06-30 19:45:49 【问题描述】:我遇到了一个不寻常的问题。
在 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 的默认时区设置控制的。并且由于 WebLogic 中的某些程序改变了它(每个程序都可以做到)而导致的错误。你知道打印出来的America/New_York
是不是JVM的时区吗?
我想到了这一点,但最近只部署了一个其他程序,我没有看到任何特定于时区的更改。但它是一个 Oracle ADF 应用程序,所以我猜 ADF 的内部可能正在发生一些事情。
为了回答您的问题,将 America/New_York 打印为 user.timezone。这就是日志包含的所有内容。
【参考方案1】:
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());
在我的电脑上运行这个 sn-p 得到以下输出:
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 时区设置的选项(据我所知)。也许他们做出了明智的选择,不包括在内,因为——正如你所看到的——这样做很容易引起混乱。
【讨论】:
你可能是对的。我会投票,但在我隔离问题之前不能接受。感谢您的洞察力! 感谢您的支持。我同意,您不仅应该自己分析,还应该等待几天,看看是否有其他答案发布,然后再接受任何答案。接受一个之后,你的问题就不会受到关注了,这不是你现在需要的。以上是关于什么控制 WebLogic 中的时区到 GMT 偏移映射?的主要内容,如果未能解决你的问题,请参考以下文章