Java 操作系统时区更改tomcat需要重新启动

Java 操作系统时区更改tomcat需要重新启动,java,datetime,tomcat,Java,Datetime,Tomcat,我的web应用程序运行在ApacheTomcat7.0上。我们调用java util calendar来获取服务器日期时间。问题是,如果系统时区发生更改,java日历将继续以“旧”时区的日期时间运行 Tomcat使用的JDK是-JDk1.6 您能告诉我们为什么tomcat需要重新启动以反映新的时区吗?最好的方法是在Java中使用日期时始终指定时区。或者在tomcat中指定 -时区=格林尼治标准时间 参数。另一种方式是Tomcat在启动时从系统加载时区。我想需要重新启动的原因是,没有人在服务器主动

我的web应用程序运行在ApacheTomcat7.0上。我们调用java util calendar来获取服务器日期时间。问题是,如果系统时区发生更改,java日历将继续以“旧”时区的日期时间运行

Tomcat使用的JDK是-JDk1.6


您能告诉我们为什么tomcat需要重新启动以反映新的时区吗?

最好的方法是在Java中使用日期时始终指定时区。或者在tomcat中指定

-时区=格林尼治标准时间


参数。另一种方式是Tomcat在启动时从系统加载时区。

我想需要重新启动的原因是,没有人在服务器主动运行并连接到internet时满足在不同时区运行的服务器。有趣的用例。显然很少见。非常罕见

将服务器设置为UTC,使用UTC启动tomcat,然后将应用程序配置为在您当前感兴趣的任何时区中格式化时间-问题已解决。

tl;博士 尽可能在UTC工作

Instant.now()  // Capture current moment in UTC.
永远不要依赖于主机操作系统、JVM或数据库的当前默认时区设置。明确指定所需/预期时区

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, same point on the timeline, different wall-clock time.
永远不要依赖服务器的时区设置 真正的问题是,您的代码取决于一个方面,您无法控制该方面,并且可以随时更改:JVM的当前默认时区

您不应该编写依赖于系统默认时区的代码。相反,始终将所需/预期时区显式指定为传递给相关类的可选参数

问题是,如果系统时区发生更改,java日历将继续以“旧”时区的日期时间运行

主机操作系统(OS)有自己的当前默认时区设置和自己的时区定义()。数据库服务器也是如此;如果在日期-时间处理方面非常复杂,例如Postgres,它可能会在内部存储自己的
tzdata
。JVM也有自己的当前默认时区设置和自己的时区定义()。当感兴趣时区的定义发生变化时,您应该通过软件产品版本更新或tzdata特定更新程序在所有三个位置更新
tzdata

我所知道的所有JVM实现在启动时都默认将自己的当前默认时区设置为主机操作系统的时区JVM启动后,更改主机操作系统时区设置应该不会对JVM产生影响,至少在我看到的Oracle和OpenJDK实现中不会

我们调用java util calendar来获取服务器日期时间

切勿使用麻烦的旧旧日期时间类,如
date
&
Calendar
。这些已经被java.time类完全取代

您能告诉我们为什么tomcat需要重新启动以反映新的时区吗

我猜您的web应用程序不恰当地缓存了UTC的偏移量,而不是始终使用时区。与UTC的偏移量只是与UTC的偏移量的小时分秒数。时区不仅仅是一段历史,它记录了过去、现在和未来某个特定地区的人们所使用的偏移量的变化。因此,始终使用时区,而不仅仅是偏移量。更多细节请参见类似问题

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用JVM的当前默认时区,请请求它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的,因为JVM中任何应用程序的任何线程中的任何代码都可能在运行时的任何时刻更改默认值

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
UTC 通常最好始终在UTC中工作,除非您的业务逻辑或用户界面需要区域。您应该学会在UTC中思考、工作、记录、存储和交换数据。在程序员或管理员的工作中,忘掉你自己的狭隘时区吧

该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期Android(类似于:类似于:
      ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.
      
      Instant instant = Instant.now() ;  // Capture current moment in UTC.