gpt4 book ai didi

带有时区的 Java 日期 secret 更改?

转载 作者:行者123 更新时间:2023-11-30 06:28:07 25 4
gpt4 key购买 nike

我们有一个网络服务应用程序,它始终以 UTC 格式输入时间

2012-12-06T05:00:00.000Z

这是将日期解析为 java util Date 对象的代码

 private static final Pattern PATTERN = Pattern.compile(
"(\\d{4})(?:-(\\d{2}))?(?:-(\\d{2}))?(?:[Tt](?:(\\d{2}))?(?::(\\d{2}))?(?::(\\d{2}))?(?:\\.(\\d{3}))?)?([Zz])?(?:([+-])(\\d{2}):(\\d{2}))?");


Matcher m = PATTERN.matcher(dateString);
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
int hoff = 0, moff = 0, doff = -1;
if (m.group(9) != null) {
doff = m.group(9).equals("-") ? 1 : -1;
hoff = doff * (m.group(10) != null ? Integer.parseInt(m.group(10)) : 0);
moff = doff * (m.group(11) != null ? Integer.parseInt(m.group(11)) : 0);
}
c.set(Calendar.YEAR, Integer.parseInt(m.group(1)));
c.set(Calendar.MONTH, m.group(2) != null ? Integer.parseInt(m.group(2))-1 : 0);
c.set(Calendar.DATE, m.group(3) != null ? Integer.parseInt(m.group(3)) : 1);
c.set(Calendar.HOUR_OF_DAY, m.group(4) != null ? Integer.parseInt(m.group(4)) + hoff: 0);
c.set(Calendar.MINUTE, m.group(5) != null ? Integer.parseInt(m.group(5)) + moff: 0);
c.set(Calendar.SECOND, m.group(6) != null ? Integer.parseInt(m.group(6)) : 0);
c.set(Calendar.MILLISECOND, m.group(7) != null ? Integer.parseInt(m.group(7)) : 0);
return c.getTime();

最近观察到一件奇怪的事情,当应用程序第一次启动时,返回的日期将被正确打印为2012 年 12 月 6 日星期四 00:00:00 EST

因为我们在 EST 时区。然后过了一会儿,经过一些执行,即使没有重新启动应用程序,相同的日期也会打印为2012 年 12 月 6 日星期四 05:00:00

我一直在深入研究应用程序,但没有看到任何会重置应用程序默认时区的更改。怎么会这样?我们开始研究这个已经一周了,但我们仍然一无所知:-(

另外,有没有办法确保应用程序继续使用系统时区,因为它不会改变?

非常感谢任何帮助/提示

最佳答案

不幸的是,TimeZone 可以通过决定调用 TimeZone.setDefault 的任何编写不当的代码从您的应用程序中更改出来。当第三方代码调用该方法时,我们实际上在我们的应用程序中被这个问题所困扰。不幸的是,解决方案是从不依赖应用程序开头之后的默认时区。我们有一个核心类,它在启动时获取默认的 TimeZone,所有需要使用系统默认值输出日期的后续代码将显式使用这个隐藏的实例(这当然是防止修改的,不要'不要忘记 TimeZone 是可变的!)。

关于带有时区的 Java 日期 secret 更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com