Quartz.net 在 UTC 时间创建每日计划

本文关键字:创建 每日 计划 时间 UTC net Quartz | 更新日期: 2023-09-27 18:33:12

我试图在每天早上 8 点(UTC 时间(解雇一份工作。问题是触发器不尊重我告诉它的时间。

我的代码如下:

    ITrigger trigger = TriggerBuilder.Create()
        .WithDailyTimeIntervalSchedule(
             s => s.WithIntervalInHours(24)
                 .OnEveryDay()
                 .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8,0)))
        .Build();
   var times = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, 10);
   foreach (var time in times)
       Console.WriteLine(time.UtcDateTime);

输出为:

30/09/2013 10:00:00 PM
1/10/2013 10:00:00 PM
2/10/2013 10:00:00 PM
3/10/2013 10:00:00 PM
4/10/2013 10:00:00 PM
5/10/2013 10:00:00 PM
6/10/2013 9:00:00 PM
7/10/2013 9:00:00 PM
8/10/2013 9:00:00 PM
9/10/2013 9:00:00 PM

6 日小时变化的原因是夏令时从本周末开始。

如何让它像我告诉它的那样在 UTC 时间上午 8 点触发?

编辑:这太疯狂了,它甚至用 Cron 时间表做到了:

ITrigger trigger = TriggerBuilder.Create()
    .WithCronSchedule("0 0 8 * * ?")
    .Build();
var times = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, 10);
foreach (var time in times)
    Console.WriteLine(time.UtcDateTime);

输出:

30/09/2013 10:00:00 PM
1/10/2013 10:00:00 PM
2/10/2013 10:00:00 PM
3/10/2013 10:00:00 PM
4/10/2013 10:00:00 PM
5/10/2013 9:00:00 PM
6/10/2013 9:00:00 PM
7/10/2013 9:00:00 PM
8/10/2013 9:00:00 PM
9/10/2013 9:00:00 PM

Quartz.net 在 UTC 时间创建每日计划

在提取源代码并挖掘之后,我找到了几个解决方案。

我最初找到了这样的解决方案:

var trigger4 = new DailyTimeIntervalTriggerImpl
{
    StartTimeUtc = DateTime.UtcNow,
    StartTimeOfDay = new TimeOfDay(8, 0, 0),
    RepeatIntervalUnit = IntervalUnit.Hour,
    RepeatInterval = 24,
    TimeZone = TimeZoneInfo.Utc
};

。这导致我调整了我的原始代码:

ITrigger trigger2 = TriggerBuilder.Create()
    .WithDailyTimeIntervalSchedule(
        s => s.WithIntervalInHours(24)
            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0))
            .InTimeZone(TimeZoneInfo.Utc))
    .Build();

这两者都给了我所追求的。我只是希望这个库有一些像样的文档。

虽然这很旧,但我还是会在这里回答。 您可以简单地执行以下操作:

ITrigger trigger = TriggerBuilder.Create() .WithCronSchedule("0 0 8 * * ?", cron => { cron.InTimeZone(TimeZoneInfo.Utc); } ) .Build();