PMa*_*Mac 7 .net c# quartz.net
我想在每天早上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);
Run Code Online (Sandbox Code Playgroud)
输出是:
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
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
PMa*_*Mac 16
在下载源代码并深入研究之后,我找到了几个解决方案.
我最初找到了这样的解决方案:
var trigger4 = new DailyTimeIntervalTriggerImpl
{
StartTimeUtc = DateTime.UtcNow,
StartTimeOfDay = new TimeOfDay(8, 0, 0),
RepeatIntervalUnit = IntervalUnit.Hour,
RepeatInterval = 24,
TimeZone = TimeZoneInfo.Utc
};
Run Code Online (Sandbox Code Playgroud)
...这导致我调整我的原始代码:
ITrigger trigger2 = TriggerBuilder.Create()
.WithDailyTimeIntervalSchedule(
s => s.WithIntervalInHours(24)
.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(8, 0))
.InTimeZone(TimeZoneInfo.Utc))
.Build();
Run Code Online (Sandbox Code Playgroud)
这两个都给了我我想要的东西.我只是希望这个库有一些不错的文档.
小智 6
虽然这是旧的,但我还是会在这里回答。您可以简单地执行以下操作:
ITrigger trigger = TriggerBuilder.Create()
.WithCronSchedule("0 0 8 * * ?", cron => { cron.InTimeZone(TimeZoneInfo.Utc); } )
.Build();