【问题标题】:Quartz-Scheduler : Deal DST with DailyTimeIntervalScheduleBuilderQuartz-Scheduler : 使用 DailyTimeIntervalScheduleBuilder 处理 DST
【发布时间】:2014-10-01 14:31:06
【问题描述】:

我遇到了 Quartz 调度程序的问题。我试图在他们的论坛中询问 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 '重新调整'下一次触发? 其实我猜是因为

...春天的时钟从 01:59 的最后一刻开始向前跳跃 标准时间到 03:00 DST,那一天有 23 小时,而在 秋天,时钟从 DST 01:59 的最后一刻向后跳到 01:00 标准时间,重复那个小时,那一天有 25 小时。[37]本地时间的数字显示不准确地显示 02:00 在转向夏季时,而是从 01:59:59.9 向前跳跃 到 03:00:00.0。

维基百科

如何强制触发器“重新调整”?

PS:我希望它在今天 00:30, 03:00, 04:30, ... 发射

【问题讨论】:

    标签: java quartz-scheduler dst


    【解决方案1】:

    实际上,在 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
    

    这是按照您的指示进行的,因为每个值之间实际间隔了 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 中显示的图表。

    【讨论】:

    • 由于 Quartz 可以触发失火指令,我期待它可以本地处理我寻找的行为。或者至少是一种补救措施。无论如何,感谢您的回答。本周我将等待“石英解决方案”,然后如果没有人发布好的石英解决方案,我会将您的答案标记为已接受;)
    猜你喜欢
    • 2017-02-18
    • 2012-12-25
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多