Java Quartz调度程序:使用DailyTimeIntervalsScheduleBuilder处理DST

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(

我被石英调度器的问题缠住了。我试着在terracota的论坛上提问,但没有得到回答

我使用Java Quartz和DailyTimeIntervalsScheduleBuilder,如下所示

 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小时运行一次,而不管它是否正好落在每天运行的同一点上


如果你在可视化这个问题上有困难,请考虑在

中显示的图表,因为石英可以触发失火指令,我希望它能处理我寻找的行为。或者至少是一种补救办法。。无论如何,谢谢你的回答。我将在本周等待“石英解决方案”,然后如果没有人发布好的石英解决方案,我将标记您的答案已被接受;)