我在CentOS服务器上运行一个大型Grails应用程序。
服务器设置为EST(GMT - 5)。
当我部署应用程序(作为战争文件)时,应用程序的日期和时间将正确几天,然后突然应用程序变得混乱并认为它是GMT,而不是EST。
这会导致域对象上的日期不正确,并导致Quartz作业在错误的时间运行。例如:
我们有一份工作,每天早上6:15在美国东部时间上午运行并发送报告 电子邮件。这发生在几天之后的正确时间 部署,然后突然每天的工作在凌晨1点15分开始运行 代替。
使用g:formatDate显示的日期字段将显示GMT EST,但日期中的小时/分钟/秒本身并没有 更改,因此每次保存记录时,日期最终都会存在 推进了五个小时。
目前正在运行Grails版本2.4.4,Apache Tomcat / 8.0.15,OpenJDK 1.8.0,但我们遇到了与各种2.3.x版本的grails,Tomcat 7和Java 7相同的行为。
我仍然不确定这是Grails问题还是Tomcat问题。任何想法如何解决它将不胜感激。
答案 0 :(得分:1)
事实证明问题是在代码中某处使用了TimeZone.setDefault()
。
在应用程序的任何地方修改这样的全局状态是非常危险的!
即使在代码中使用,乍看之下由old = current(); set(new); dostuff(); set(old)
之类的东西“保护”,也可能会破坏(但更难捕获)因为它会在短时间内发生变化并出现错误它周围变得更加模糊。例外情况将会完成......