[英]Cron trigger in Quartz.Net for hourly values
我正在檢查Quartz.Net的cron觸發器,並注意到當我使用除小時以外的任何其他觸發器時,它會將時間偏移到UTC(應該總是這樣),但是當我對Hourd cron執行相同操作時選擇當地時間。
例如
假設我的開始時間是2014-05-31 15:44:00
對於接下來的6次每小時計划
Cron表達式:
0 0 0/1 1/1 * ? *
0 0 0/1 1/1 * ? *
給出為
5/31/2014 5:30:00 PM +00:00
5/31/2014 6:30:00 PM +00:00
5/31/2014 7:30:00 PM +00:00
5/31/2014 8:30:00 PM +00:00
5/31/2014 9:30:00 PM +00:00
5/31/2014 10:30:00 PM +00:00
這顯示了當地時間。
但是當我嘗試說每周時間表
Cron:
0 44 15 ? * SUN,MON *
0 44 15 ? * SUN,MON *
日程安排如下
6/1/2014 10:14:00 AM +00:00
6/2/2014 10:14:00 AM +00:00
6/8/2014 10:14:00 AM +00:00
6/9/2014 10:14:00 AM +00:00
6/15/2014 10:14:00 AM +00:00
6/16/2014 10:14:00 AM +00:00
這與UTC偏移,這是正確的。
這是我正在使用的代碼
var cron = new Quartz.CronExpression("0 0 0/1 1/1 * ? *");
DateTimeOffset? nextFire = cron.GetNextValidTimeAfter(Convert.ToDateTime("5/31/2014 4:30:00 PM"));
顯然,我是動態更改參數的。
這是執行時間表計算的代碼
var jobItem = (DbContext.jobs.Where(job => job.Id == id)).FirstOrDefault();
List<DateTimeOffset> scheduleTimes = new List<DateTimeOffset>();
var time = DateTimeOffset.Now;
if (!string.IsNullOrEmpty(jobItem.CronExpression))
{
for (int i = 0; i <= 5; i++)
{
var date = GetScheduleForCron(jobItem.CronExpression, time);
scheduleTimes.Add(date.Value);
time = date.Value;
}
}
else
{
var jobAttribute =
(from attribute in DbContext.jobattributes
where attribute.JobId == jobItem.Id
select attribute.SpecificDate).FirstOrDefault();
scheduleTimes.Add(jobAttribute.Value);
}
public static DateTimeOffset? GetScheduleForCron(string cronexpression, DateTimeOffset date)
{
var cron = new CronExpression(cronexpression);
return cron.GetNextValidTimeAfter(date.DateTime);
}
編輯:我使用http://www.cronmaker.com/交叉驗證我的日程安排。
您可能會混淆本地時間和UTC時間的使用。 尤其是如果您具有Convert.ToDateTime("5/31/2014 4:30:00 PM")
, DateTimeOffset.Now
或date.DateTime
。 Quartz的一般規則是
UTC時間進來,UTC時間走出來
。 這是示例,可為您的案例提供預期的輸出(為簡潔起見,使用了非builder API):
var firstTrigger = new CronTriggerImpl();
firstTrigger.CronExpressionString = "0 0 0/1 1/1 * ? *";
firstTrigger.StartTimeUtc = new DateTime(2014, 05, 31, 15, 44, 00).ToUniversalTime();
Console.WriteLine("first trigger fire times:");
Console.WriteLine(string.Join(Environment.NewLine, TriggerUtils.ComputeFireTimes(firstTrigger, null, 6).Select(x => x.ToLocalTime())));
var secondTrigger = new CronTriggerImpl();
secondTrigger.CronExpressionString = "0 44 15 ? * SUN,MON *";
secondTrigger.StartTimeUtc = new DateTime(2014, 05, 31, 15, 44, 00).ToUniversalTime();
Console.WriteLine("second trigger fire times:");
Console.WriteLine(string.Join(Environment.NewLine, TriggerUtils.ComputeFireTimes(secondTrigger, null, 6).Select(x => x.ToLocalTime())));
它將輸出(在我的GMT + 3語言環境中,cron觸發器默認在當前語言環境的時區運行):
first trigger fire times
31.5.2014 16:00:00 +03:00
31.5.2014 17:00:00 +03:00
31.5.2014 18:00:00 +03:00
31.5.2014 19:00:00 +03:00
31.5.2014 20:00:00 +03:00
31.5.2014 21:00:00 +03:00
second trigger fire times:
1.6.2014 15:44:00 +03:00
2.6.2014 15:44:00 +03:00
8.6.2014 15:44:00 +03:00
9.6.2014 15:44:00 +03:00
15.6.2014 15:44:00 +03:00
16.6.2014 15:44:00 +03:00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.