java - Quartz 调度程序 : Deal DST with DailyTimeIntervalScheduleBuilder

标签 java quartz-scheduler dst

我遇到了 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/

相关文章:

java - Android:后台服务总是关闭

java - Android 应用程序在 gms.vision api 的 Release模式下崩溃

python - 如何在 Python Pandas 中处理由于夏令时而具有可变时区偏移的时间序列?

java - 取消部署应用程序时触发功能

java - 如何将 Quartz 与 QuartzInitializerListener 一起使用?

c++ - 处理夏令时 - C++

c# - 时区转换和夏令时

java - 是否有支持泛型类型的 XML 模式的替代方案?

java - org.openqa.selenium.NoSuchWindowException : Unable to get browser

java - Spring 和 quartz 的错误