我遇到了 Quartz Scheduler 的问题。我试图在他们的论坛中询问 terracota,但没有得到答案......
我使用 Java Quartz 和 DailyTimeIntervalScheduleBuilder 如下
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
但采用夏令时:
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 ? 其实我猜是因为
...in spring the clock jumps forward from the last moment of 01:59 standard time to 03:00 DST and that day has 23 hours, whereas in autumn the clock jumps backward from the last moment of 01:59 DST to 01:00 standard time, repeating that hour, and that day has 25 hours.[37] A digital display of local time does not read 02:00 exactly at the shift to summertime, but instead jumps from 01:59:59.9 forward to 03:00:00.0.
Wikipedia
我该如何强制触发器“重新调整”?
PS:我希望它在今天的 00:30、03:00、04:30... 触发
最佳答案
实际上,在 CET/CEST 的 Spring 过渡日,它看起来像这样:
Sun Mar 30 00:30:00 CET 2014
Sun Mar 30 03:30:00 CEST 2014
Sun Mar 30 05:30:00 CEST 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 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
两者相隔 120 分钟。同样,如果您愿意,您可以选择进行调整,因此它的运行方式如下:
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,60,120] - 即使时间对齐。
TL;DR - 调度程序无法为您做出此决定。您需要决定您想要什么行为并相应地调整该行为。如果您不理会它,它只会按照您的指示在您指定的窗口内每 2 小时运行一次,无论它是否每天都恰好落在其运行的相同时间点。
如果您无法直观地看到这一点,请考虑 the DST tag wiki 中显示的图表。 .
关于java - Quartz 调度程序 : Deal DST with DailyTimeIntervalScheduleBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25197933/