Java Quartz调度程序:使用DailyTimeIntervalsScheduleBuilder处理DST
我被石英调度器的问题缠住了。我试着在terracota的论坛上提问,但没有得到回答 我使用Java Quartz和DailyTimeIntervalsScheduleBuilder,如下所示Java Quartz调度程序:使用DailyTimeIntervalsScheduleBuilder处理DST,java,quartz-scheduler,dst,Java,Quartz Scheduler,Dst,我被石英调度器的问题缠住了。我试着在terracota的论坛上提问,但没有得到回答 我使用Java Quartz和DailyTimeIntervalsScheduleBuilder,如下所示 DailyTimeIntervalScheduleBuilder dti = dailyTimeIntervalSchedule() .startingDailyAt(new TimeOfDay(0, 30)) .endingDailyAt(new TimeOfDay(
DailyTimeIntervalScheduleBuilder dti = dailyTimeIntervalSchedule()
.startingDailyAt(new TimeOfDay(0, 30))
.endingDailyAt(new TimeOfDay(7, 0))
.onEveryDay()
.withIntervalInHours(2)
.withMisfireHandlingInstructionFireAndProceed();
如你所见,我希望触发器每天在00:30到07:00之间每两小时触发一次
在“正常”的日子里,触发器如下所示:
Sat Mar 01 00:30:00 CET 2014
Sat Mar 01 02:30:00 CET 2014
Sat Mar 01 04:30:00 CET 2014
但对于DST:
Sun Mar 30 00:30:00 CEST 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 05:30:00 CEST 2014
我理解为什么第二次触发的时间戳计算时间是03:30,而不是02:30,但为什么触发器不在04:30“重新调整”下一次触发?
实际上我想是因为
…在春天,时钟从01:59的最后一刻开始向前跳
标准时间为夏令时03:00,当天为23小时,而
秋季时钟从美国夏令时01:59的最后一刻向后跳至
01:00标准时间,重复该小时,该天有25分钟
小时。[37]本地时间的数字显示器不能准确读取02:00
在转换到夏季时,而是从01:59:59.9向前跳
至03:00:00.0
维基百科
我如何处理强制触发器“重新调整”
附言:我要它在00:30,03:00,04:30开火。。。这一天事实上,在CET/CEST的春季前进过渡日,它看起来是这样的:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 05:30:00 CEST 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 03:30:00 CET 2014
Sun Oct 26 05:30:00 CET 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 04:30:00 CET 2014
Sun Oct 26 06:30:00 CET 2014
这是按照您的说明进行的,因为每个值之间实际上已经过了120分钟
如果按照您的建议进行调整:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:00:00 CEST 2014
Sun Mar 30 04:30:00 CEST 2014
Sun Mar 30 06:30:00 CEST 2014
那么,在前两点之间只需要90分钟——这不是您要求调度程序执行的操作
另一种常见的调整方法是仅移动一个受影响的值:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 04:30:00 CEST 2014
Sun Mar 30 06:30:00 CEST 2014
OR
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 01:30:00 CET 2014
Sun Mar 30 04:30:00 CEST 2014
Sun Mar 30 06:30:00 CEST 2014
然后你要么经过[120,60,120],要么经过[60,120,120]。有时这更容易接受,因为时间是一致的。有时候不是
也可以考虑,在倒退转变的那天,你有一个相关的问题。如果不进行调整,它将如下运行:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 05:30:00 CEST 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 03:30:00 CET 2014
Sun Oct 26 05:30:00 CET 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 04:30:00 CET 2014
Sun Oct 26 06:30:00 CET 2014
相隔120分钟。同样,如果愿意,您可以选择进行调整,使其按如下方式运行:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 05:30:00 CEST 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 03:30:00 CET 2014
Sun Oct 26 05:30:00 CET 2014
Sun Oct 26 00:30:00 CEST 2014
Sun Oct 26 02:30:00 CEST 2014
Sun Oct 26 04:30:00 CET 2014
Sun Oct 26 06:30:00 CET 2014
但现在的时间间隔是[120,60120]——即使时间一致
TL;DR-计划程序无法为您做出此决定。你需要决定你想要什么样的行为,并相应地调整这种行为。如果您不去管它,它只需按照您的指示在指定的窗口内每2小时运行一次,而不管它是否正好落在每天运行的同一点上
如果你在可视化这个问题上有困难,请考虑在
中显示的图表,因为石英可以触发失火指令,我希望它能处理我寻找的行为。或者至少是一种补救办法。。无论如何,谢谢你的回答。我将在本周等待“石英解决方案”,然后如果没有人发布好的石英解决方案,我将标记您的答案已被接受;)