石英 cron 表达式为 0/0



作为输入验证的一部分,我在想这是否是一个真正有效的cron表达式以及它将如何执行:

0 0/0 * * * ?

石英验证返回真

org.quartz.CronExpression.isValidExpression("0 0/0 * * * ?")

那么,这是否一直运行,从不,每小时或每分钟......?

您可以使用 TriggerUtils.computeFireTimesBetween() 找到结果:

try {
        CronTriggerImpl cron = new CronTriggerImpl();
        cron.setStartTime(new Date());
        cron.setCronExpression("0 0/0 * * * ?");
        BaseCalendar calendar = new BaseCalendar();
        List<Date> result = TriggerUtils.computeFireTimesBetween(cron, calendar, new Date(),DateBuilder.futureDate(1, IntervalUnit.DAY));
        for (Date date : result) {
            System.out.println(date);
        }
    } catch (ParseException e) {
        e.printStackTrace();
    }

输出为:

Thu Apr 05 18:00:00 CST 2012
Thu Apr 05 19:00:00 CST 2012
Thu Apr 05 20:00:00 CST 2012
Thu Apr 05 21:00:00 CST 2012
Thu Apr 05 22:00:00 CST 2012
Thu Apr 05 23:00:00 CST 2012
Fri Apr 06 00:00:00 CST 2012
Fri Apr 06 01:00:00 CST 2012
Fri Apr 06 02:00:00 CST 2012
Fri Apr 06 03:00:00 CST 2012
Fri Apr 06 04:00:00 CST 2012
.......................

因此,0 0/0 * * * ?将每小时以 0 分 0 秒运行一次。

根据 CronTrigger 教程文档:

  • / - 用于指定增量。例如,秒字段中的"0/15"表示"秒 0、15、30 和 45"。秒字段中的"5/15"表示"秒 5、20、35 和 50"。您还可以在"字符后指定"/"- 在这种情况下,"等效于在"/"之前有"0"。月中日期字段中的"1/3"表示"从每月的第一天开始每 3 天开火一次"。

这意味着在这种情况下0没有真正的意义。然而,CronExpression似乎忽略了它,只是丢弃了该值,有效地将此表达式视为:

0 0 * * * ?

如果您很好奇,这是丢弃无效0值的代码:

    if ((incr == 0 || incr == -1) && val != ALL_SPEC_INT) {
        if (val != -1) {
            set.add(Integer.valueOf(val));
        } else {
            set.add(NO_SPEC);
        }
        return;
    }

更多信息,请访问 CronTrigger 文档。我的猜测是表达式0 0/0 * * * ?表示每小时一次(即 0/0不表示每分钟)。但是,如果您需要所有时间(即每秒),则可以使用 * * * * ? * .

最新更新