用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>

解决方案 »

  1.   

    把出发计算的时间提前8个小时不是也可以吗<property name="cronExpression" value="0 5 16 * * ?"/> 
    修改成
    <property name="cronExpression" value="0 5 8 * * ?"/> 
      

  2.   

    你说的技术我不是很懂
    不过既然你说以查明原因是:quartz中使用的时区是GMT
    虽然不同时区的时间是不一样的,但是都是有对应关系的吧。找到对应的那个时间设置上去不行吗?其实觉得8楼说的蛮有道理啊
    如果你有需求取系统时间(GMT),并觉得和本地时间不一致,那你在输出这个时间的时候(你自己有代码处理的吧),再反向的把时间扣回去不行吗?
      

  3.   

    感觉你的配置没问题,猜测下吧,可能是因为你的bean“timeZone”没有配置好,所以在quartz中没有起作用,而quartz中默认使用的时区是GMT,你的系统时间是用的北京时间,也就是GMT+8,所以就有了悬殊。
    BTW:测试的时候,可以通过修改你的系统时间来完成,不需要真的等待8个小时的。
      

  4.   

    java里好像没有Asia/Beijing 时区
    换成GMT+08:00试试
      

  5.   

    其实不用那么复杂 只需要再你开启调度计划的同时设置时区即可
    TimeZone.setDefault(TimeZone.getTimeZone("Etc/GMT-8"));