簡體   English   中英

Quartz.Net中的Cron觸發器以獲取小時值

[英]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.Nowdate.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM