Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Tomcat中处理夏时制而无需重新启动服务器_Java_Datetime_Tomcat_Dst - Fatal编程技术网

Java 在Tomcat中处理夏时制而无需重新启动服务器

Java 在Tomcat中处理夏时制而无需重新启动服务器,java,datetime,tomcat,dst,Java,Datetime,Tomcat,Dst,我有一个Java web应用程序在Tomcat上运行,用于为客户机创建预定事件。我有一个关于底层操作系统、Tomcat和JVM的默认日期时间的问题 当我通过Java代码检索日期时,它与底层操作系统类似。然后我更改了操作系统时间,只是为了模拟夏令时效果,但应用程序并不反映操作系统时间 然后我阅读了更多关于它的内容,发现JRE负责维护JVM的日期时间。但是,当我重新启动tomcat时,它开始反映操作系统时间 有人能解释一下这背后的理论吗?作为我的读数,我们可以使用TZupdater更新JRE的最新日

我有一个Java web应用程序在Tomcat上运行,用于为客户机创建预定事件。我有一个关于底层操作系统、Tomcat和JVM的默认日期时间的问题

当我通过Java代码检索
日期时,它与底层操作系统类似。然后我更改了操作系统时间,只是为了模拟夏令时效果,但应用程序并不反映操作系统时间

然后我阅读了更多关于它的内容,发现JRE负责维护JVM的日期时间。但是,当我重新启动tomcat时,它开始反映操作系统时间


有人能解释一下这背后的理论吗?作为我的读数,我们可以使用TZupdater更新JRE的最新日期时间更改,系统将在不重新启动tomcat的情况下处理夏令时。

此处涉及不同的设置:

  • 系统不仅有一个当前时间,而且还有一个时区
  • Tomcat运行的JVM也有一个时区设置
操作系统和JVM的时区设置负责夏季(夏令时,DST)。因此,设置系统时间以反映DST是不正确的方法。相反,您应该将操作系统时区设置为所需的时区,操作系统将自动调整DST在春季开始和秋季结束时显示的时间

您确实不应该使用
Date
来表示日期和时间。该类早已过时,现代java日期和时间API java.time的类更易于使用。如果您仍然这样做,则您的
日期
不包含时区中的时间。相反,它代表的是一个独立于时区的时间线上的点。让许多人困惑的是,当您打印日期,从而隐式调用其
toString
方法时,该
toString
方法会获取JVM的时区设置并使用它生成字符串。这可能会给您一个错误的印象,
日期
中有一个时区

现在我提到了JVM时区设置。除非为了获得其他东西而做了一些事情,否则JVM时区设置在JVM启动时会初始化为操作时区设置,但即使您更改了操作系统设置,也不会更改。另一方面,JVM设置可以从JVM中运行的Java程序更改(这包括在Tomcat服务器中运行的任何程序)

通常,用Java获取当前时间的最佳方法是自己指定时区。例如:

    System.out.println(ZonedDateTime.now(ZoneId.of("Pacific/Noumea")));
这是刚印出来的

2018-03-06T06:20:23.903292+11:00[太平洋/努美阿]

发生的事情是,Java从操作系统时钟获取当前时间,并将其转换为指定时区中的当前时间,如果DST在每年的这个时候生效,则考虑DST。与日期相反,
ZoneDateTime
是日期、时间和时区
ZoneDateTime
是我提到的现代API java.time中的一个类

通过指定明确的时区,您可以独立于任何可能发生不可预测更改的设置。通过依赖您所需的时区,您可以在DST开始和结束时不必更改系统时钟

没错,您可能需要使用TZupdater来确保JVM包含正确的信息,例如关于时区的DST。政客们有时会在短时间内更改DST规则,而当这种情况发生时,世界上的Java安装不会自动更改。升级Java版本时,通常还会获得最新的时区信息。但是,如果您使用的是一个不太全新的Java版本,TZupdater是确保您的时区信息是最新的方法


链接:

类似于:类似于:刚刚看到@BasilBourque提供的。凯斯,这是给你的礼物。:-)