2015-02-23 26 views
0

我在CentOS服务器上运行大型Grails应用程序。Tomcat上的Grails应用程序在部署后几天忘记时区

服务器设置为EST(GMT - 5)。

当我部署应用程序(作为战争文件)时,应用程序的日期和时间将是正确的几天,然后突然该应用程序变得困惑,并认为它是格林尼治标准时间,而不是美国东部时间。

这会导致域对象上的日期不正确,还会导致Quartz作业在错误的时间运行。例如:

  • 我们有每天6:15 16:00运行,并通过电子邮件 发出报告工作。这发生在 部署后几天的正确时间,然后突然日常工作在1:15 AM 开始运行。

  • 日期字段中显示相克:formatDate将显示GMT,而不是EST的 但时/分/秒日期本身不 变化,所以每次在保存记录的日期最终被 推转发五个小时。

当前运行的Grails 2.4.4,的Apache Tomcat/8.0.15,OpenJDK的1.8.0版本,但我们经历了Grails的各种版本2.3.x版本,Tomcat的7和Java 7

相同的行为

我还不确定这是Grails问题还是Tomcat问题。任何想法如何解决它将不胜感激。

+1

你可以排除,你的代码中的“全局”状态(例如'TimeZone.setDefault()')的东西搞乱了吗? – cfrick 2015-02-23 12:38:46

+0

这就是问题所在!在应用程序的一个很少使用的区域有一个错误的TimeZone.setDefault()。 请将您的评论更改为答案,我会将其关闭。谢谢。 – MT1 2015-02-23 14:43:19

回答

1

事实证明,问题是代码中某处使用了TimeZone.setDefault()

像这样在应用程序的任何位置修改全局状态是非常危险的!

即使在代码中使用,即乍一看被类似old = current(); set(new); dostuff(); set(old)这样的“保护”的代码,它很可能会中断(但更难以捕获),因为它会在短时间内发生变化,更隐晦。例外将做其余的...

相关问题