跨越午夜的Quartz.NET每日时间间隔

本文关键字:时间 每日 NET 午夜 Quartz 跨越 | 更新日期: 2023-09-27 18:07:22

我在我的域模型中为我的计划任务提供了以下配置设置,我正在尝试使用Quartz.NET 2.3.3创建触发器。

  1. 开始时间TimeSpan
  2. 结束时间TimeSpan
  3. 重复间隔TimeSpan
  4. 启用工作日DayOfWeek[]

我可以用这些信息成功地创建一个每日时间间隔触发器。

var trigger = TriggerBuilder
    .Create()
    .WithDailyTimeIntervalSchedule(c => c
        .StartingDailyAt(scheduledTask.StartTime.ToTimeOfDay())
        .EndingDailyAt(scheduledTask.EndTime?.ToTimeOfDay())
        .OnDaysOfTheWeek(scheduledTask.WeekdaysEnabled.ToDaysOfWeek().ToArray())
        .WithIntervalInSeconds((int)scheduledTask.RepeatInterval.TotalSeconds)
        .InTimeZone(timeZoneInfo))
    .Build();

但是,我配置的EndTime可能在StartTime之前。例如,22:30到04:00(从晚上10:30运行到第二天凌晨4:00,以指定的间隔在午夜边界上重复(。"每日时间间隔计划"似乎不支持这一点。它只在开始时发射一次,以后再也不会发射了。

我试过使用CronTrigger,因为它可以跨越午夜边界,但它不能正确地支持一天中的开始/结束时间(例如,0 30-0/30 22-4 ? * *从晚上10:00到凌晨4:30每30分钟运行一次。

有什么方法可以在Quartz.NET中创建此计划吗?

跨越午夜的Quartz.NET每日时间间隔

我通过创建两个Daily Time Interval触发器解决了这个问题。一个触发器的开始时间为晚上10:30,没有结束时间(运行到一天结束(。另一个触发器没有开始时间,但结束时间为凌晨4:00。

使用这两个触发器调度作业会产生所需的激发时间。

1/01/2015 10:30:00 PM
1/01/2015 11:00:00 PM
1/01/2015 11:30:00 PM
2/01/2015 12:00:00 AM
2/01/2015 12:30:00 AM
2/01/2015 1:00:00 AM
2/01/2015 1:30:00 AM
2/01/2015 2:00:00 AM
2/01/2015 2:30:00 AM
2/01/2015 3:00:00 AM
2/01/2015 3:30:00 AM
2/01/2015 4:00:00 AM
2/01/2015 10:30:00 PM
2/01/2015 11:00:00 PM
2/01/2015 11:30:00 PM
3/01/2015 12:00:00 AM
3/01/2015 12:30:00 AM
3/01/2015 1:00:00 AM
3/01/2015 1:30:00 AM
3/01/2015 2:00:00 AM
3/01/2015 2:30:00 AM
3/01/2015 3:00:00 AM
3/01/2015 3:30:00 AM
3/01/2015 4:00:00 AM