日期:2014-05-20  浏览次数:20847 次

quartz 排程 晚8小时,时区问题
用quartz排程,结果排程程序执行的时间比预定的时间晚8个小时,后来查明原因quartz中使用的时区是GMT,比北京时间刚好晚8个小时,而我的系统又使用的是北京时间。在网上查了下资料,大概有两种解决方法:
1、修改jvm启动参数,即把jvm的时区修改为北京时间-Duser.timezone=Asia/Beijing。(百度)
2、修改quartz的配置文件。(google)
本人比较偏向选择第二种方法,因为它不会影响到其他的东西,但是此方法不是很会,再次请教一下:

红色部分为新加的选择时区的配置档,知道的请不吝赐教,不知道的也欢迎来讨论,共同学习

<bean id="timeZone" class="java.util.TimeZone" factory-method="getTimeZone">
<constructor-arg value="Asia/Beijing"/>
</bean>

<bean id="businessReport" class="com.pega.service.BusinessReport"/>

<bean id="reportTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name = "targetObject" ref="businessReport"/>
<property name="targetMethod" value="perform"/>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="reportTask"/>
<property name="cronExpression" value="0 5 16 * * ?"/>
<property name="timeZone" ref="timeZone"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"/>
</list>
</property>
</bean>

------解决方案--------------------
这个 没搞过。。。
------解决方案--------------------
把出发计算的时间提前8个小时不是也可以吗

<property name="cronExpression" value="0 5 16 * * ?"/> 
修改成
<property name="cronExpression" value="0 5 8 * * ?"/> 

------解决方案--------------------
你说的技术我不是很懂
不过既然你说以查明原因是:quartz中使用的时区是GMT
虽然不同时区的时间是不一样的,但是都是有对应关系的吧。找到对应的那个时间设置上去不行吗?

其实觉得8楼说的蛮有道理啊
如果你有需求取系统时间(GMT),并觉得和本地时间不一致,那你在输出这个时间的时候(你自己有代码处理的吧),再反向的把时间扣回去不行吗?
------解决方案--------------------
感觉你的配置没问题,猜测下吧,可能是因为你的bean“timeZone”没有配置好,所以在quartz中没有起作用,而quartz中默认使用的时区是GMT,你的系统时间是用的北京时间,也就是GMT+8,所以就有了悬殊。
BTW:测试的时候,可以通过修改你的系统时间来完成,不需要真的等待8个小时的。