gpt4 book ai didi

java - 环境之间的时区差异

转载 作者:搜寻专家 更新时间:2023-11-01 00:54:18 24 4
gpt4 key购买 nike

我有一个基于 Spring 的应用程序,它托管在两个环境中:S1S2 - RedHat 服务器上的 tomcat 8 实例。问题是,出于日志记录和持久性目的,它认为“现在”的时间各不相同:

  • 它在 S1 上报告正确的时间
  • S2
  • 休息一小时

环境信息:

  • 红帽企业 Linux 服务器 6.9
  • JVM 版本:1.8
  • -Duser.timezone=欧洲/柏林
  • /etc/localtime 对于两种环境都是一样的

我编写了简单的调试代码,结果因环境而异:

System.out.println("[TimeZone]TimeZone ID: " + TimeZone.getDefault().getID());
System.out.println("[TimeZone]TimeZone name: " + TimeZone.getDefault().getDisplayName());

Date date = new Date();
LocalDateTime localDate = LocalDateTime.now();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

System.out.println("[Date]Date and time: " + df.format(date));
System.out.println("[LocalDateTime]Date and time: " + formatter.format(localDate));

df.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
ZonedDateTime zdt = localDate.atZone(ZoneId.of("Europe/Berlin"));

System.out.println("[Date]Date and time in Berlin: " + df.format(date));
System.out.println("[ZonedDateTime]Date and time in Berlin: " + formatter.format(zdt));

结果:

S1

[TimeZone]TimeZone ID: Europe/Berlin
[TimeZone]TimeZone name: Central European Time
[Date]Date and time: 2018-07-10 14:24:52
[LocalDateTime]Date and time: 2018-07-10 14:24:52
[Date]Date and time in Berlin: 2018-07-10 14:24:52
[ZonedDateTime]Date and time in Berlin: 2018-07-10 14:24:52

S2

[TimeZone]TimeZone ID: GMT+01:00
[TimeZone]TimeZone name: GMT+01:00
[Date]Date and time: 2018-07-10 13:29:18
[LocalDateTime]Date and time: 2018-07-10 13:29:18
[Date]Date and time in Berlin: 2018-07-10 14:29:18
[ZonedDateTime]Date and time in Berlin: 2018-07-10 13:29:18

一些更多的诊断信息:

xxx@serv1:~ > ls -l /etc/localtime
-rw-r--r--. 1 root root 2309 Apr 8 2016 /etc/localtime
xxx@serv1:~ > zdump /etc/sysconfig/clock
/etc/sysconfig/clock Fri Jul 20 09:21:01 2018

xxx@serv2:~ > ls -l /etc/localtime
-rw-r--r--. 1 root root 2309 Feb 13 2014 /etc/localtime
xxx@serv2:~ > zdump /etc/sysconfig/clock
/etc/sysconfig/clock Fri Jul 20 09:20:47 2018

您可能已经注意到,尽管设置了 JVM 属性,但 S2 上的应用程序未正确加载 TimeZone。

那么问题来了,我怎样才能更正S2 上的应用程序的时间?或者至少,我该如何进一步调查?

最佳答案

看起来像一个简单的问题:

S1 上,您已将 Europe/Berlin 设置为时区,在 S2 上,您设置了 GMT+01:00

您还告诉我们您的实际日期是 2018-07-10,这是德国的夏令时(从 S1 时区欧洲/柏林提取)。

所以在 S1 上,时区 Europe/Berlin 根据夏令时(夏令时)在 GMT+01 和 GMT+02 之间变化 - 而在 S2 始终是 GMT+01。

这解释了 S1 和 S2 之间的 1 小时差异。

要解决此问题,您最好将 S2 上的时区也更改为 Europe/Berlin,以便在那里也可以使用自动夏令时。

1 小时的休息时间只能在夏季检测到,但在正常(通常被错误地称为“冬季”)时间范围内检测不到。

关于java - 环境之间的时区差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51269510/

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