环境之间的时区差异

时间:2018-07-10 15:47:12

标签: java spring datetime redhat

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

  • 它在 S1
  • 上报告正确的时间
  • S2
  • 上需要一个小时

环境信息:

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

我编写了简单的调试代码,结果在不同的环境下有所不同:

SessionFactory

结果:

S1

spring.jpa.properties.hibernate.current_session_context_class = org.springframework.orm.hibernate5.SpringSessionContext

S2

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));

更多对角线信息:

[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

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

问题是,我该如何纠正 S2 上的应用的时间?或者至少我该如何进一步调查?

1 个答案:

答案 0 :(得分:0)

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

S1 上,您已将欧洲/柏林设置为时区, 在 S2 上,您已设置 GMT + 01:00

还请告知我们您的实际日期是 2018-07-10 ,该日期位于德国的夏季时段(摘自欧洲S1时区/柏林)。

所以在 S1 上,时区欧洲/柏林在夏令时(格林尼治标准时间+01)和格林尼治标准时间+02之间变化,具体取决于夏时制(夏令时)-而在 S2 始终为GMT + 01。

这说明了S1和S2之间的1小时差异。

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

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