我现有工作的getNextFireTime

hig*_*ers 4 quartz-scheduler quartz.net

我尝试了几个小时的Quartz.com文档和谷歌搜索...但是找不到关于如何获得Next Job的一篇好文章(将来可以解雇).

我正在使用CronTrigger Expression来安排作业,使用VB.net(winforms).工作正常...但我希望我的用户看到它下一次火灾.我在我的数据库中存储CronExpression,我可以使用该Expression 向我的最终用户显示下一个Fire Date/Time吗?或者如果有其他可能的方法,请提供建议(简单明了).

谢谢

编辑

以下代码返回下一个作业将在12分钟而不是20分钟后触发

    Dim exp As CronExpression = New CronExpression("0 0/20 * * * ?")
    Dim nextFire As String = exp.GetNextValidTimeAfter(DateTime.Now)
    MsgBox(nextFire)
Run Code Online (Sandbox Code Playgroud)

Lef*_*tyX 5

您可以创建一个新的JobKey

JobKey jobKey = new JobKey(jobName, groupName);
Run Code Online (Sandbox Code Playgroud)

并使用键来获取作业详细信息:

var detail = scheduler.GetJobDetail(jobKey);
Run Code Online (Sandbox Code Playgroud)

这是一个简单的功能,可以满足您的需求:

    private DateTime getNextFireTimeForJob(IScheduler scheduler, string jobName, string groupName = "")
    {
        JobKey jobKey = new JobKey(jobName, groupName);
        DateTime nextFireTime = DateTime.MinValue;

        bool isJobExisting = Scheduler.CheckExists(jobKey);
        if (isJobExisting)
        {
            var detail = scheduler.GetJobDetail(jobKey);
            var triggers = scheduler.GetTriggersOfJob(jobKey);

            if (triggers.Count > 0)
            {
                var nextFireTimeUtc = triggers[0].GetNextFireTimeUtc();
                nextFireTime = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTimeUtc.Value.DateTime);
            }
        }

        return (nextFireTime);
    }
Run Code Online (Sandbox Code Playgroud)

仅当每个作业有一个触发器时,它才有效.
如果你的工作中有多个触发器,你可以遍历它们:

foreach (ITrigger trigger in triggers)
{
    Console.WriteLine(jobKey.Name);
    Console.WriteLine(detail.Description);
    Console.WriteLine(trigger.Key.Name);
    Console.WriteLine(trigger.Key.Group);
    Console.WriteLine(trigger.GetType().Name);
    Console.WriteLine(scheduler.GetTriggerState(trigger.Key));
    DateTimeOffset? nextFireTime = trigger.GetNextFireTimeUtc();
    if (nextFireTime.HasValue)
    {
        Console.WriteLine(TimeZone.CurrentTimeZone.ToLocalTime(nextFireTime.Value.DateTime).ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

或使用Linq(System.Linq):

 var myTrigger = triggers.Where(f => f.Key.Name == "[trigger name]").SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)