之间有区别吗?和*在cron表达式中?奇怪的例子


问题内容

我的系统中有以下cron表达式:

0 0 0/1 1/1 * ? *

你知道吗?我不知道这是什么意思。写这本书的家伙在接下来的两周里放假,所以我得自己弄清楚。该文档可以在这里找到

根据文档,我们有:

* * * * * * *
| | | | | | | 
| | | | | | +-- Year              (range: 1970-2099)
| | | | | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| | | | +------ Month of the Year (range: 0-11 or JAN-DEC)
| | | +-------- Day of the Month  (range: 1-31)
| | +---------- Hour              (range: 0-23)
| +------------ Minute            (range: 0-59)
+-------------- Second            (range: 0-59)

好的,让我告诉您我的想法:我相信该表达式的意思是:

start when:
    seconds:        0
    minutes:        0
    hours:          0
    dayOfMonth      1
    monthOfYear     any
    dayOfWeek       any
    year            any

run every:
    1               hour
    1               dayOfWeek
when:
    dayOfWeek same as on first execution

但是,可用的cron表达式监视器表示,它仅表示每小时。作为编写高级Java开发人员的人,他必须知道编写此表达式的任何理由,而不是:

0 0 * * * * *

我们使用org.springframework.scheduling.quartz.QuartzJobBean

简短的摘要

好吧,我认为我的问题是:0 0 0/1 1/1 * ? *和之间有什么区别0 0 * * * * *

编辑:

该文档可在此处找到。


问题答案:

0/1表示从小时开始,0每个1小时重复一次,
1/1是从该月的第一天开始并1每天执行

因此,此模式 每小时执行一次cron,从一个月的第一天开始,然后每天重复一次。

有使用需求?的一个dayOfWeekdayOfMonth
用于指定既是一天的周和日的日值的支持是不完整的(你当前必须使用“ ?在这些领域的一个”字符)。– xenteros 7分钟前

然后,0 0 * * * ? *(而不是0 0 * * * *?如您所说,必须是强制性的)将是相同的表达式,忽略秒和分钟,并采用其他元素的每个值,将每小时执行一次。


根据您的信息:

0 0 0/1 1/1 * ? *
| |  |   |  | | | 
| |  |   |  | | +-- Year              (range: 1970-2099)
| |  |   |  | +---- Day of the Week   (range: 1-7 or SUN-SAT)
| |  |   |  +------ Month of the Year (range: 0-11 or JAN-DEC)
| |  |   +--------- Day of the Month  (range: 1-31)
| |  +------------- Hour              (range: 0-23)
| +---------------- Minute            (range: 0-59)
+------------------ Second            (range: 0-59)

以及以下特殊字符的解释

* (“所有值”)

用于选择字段中的所有值。例如,分钟字段中的“”表示*“每分钟”。

? (“无特定值”)

当您需要在允许使用字符的两个字段之一中指定某些内容而在另一个不允许使用的字段中指定内容时很有用。例如,如果我希望触发器在每月的某个特定日期(例如,第10天)触发,但不在乎一周中的哪一天发生,则将“
10”设置为月字段,以及“?” 在星期几字段中。

/

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


*和之间的差异?

为了解释之间的差异?,并*在表达式,首先来看看这个表:

Field Name      Mandatory   Allowed Values      Allowed Special Characters
Seconds         YES         0-59                , - * /
Minutes         YES         0-59                , - * /
Hours           YES         0-23                , - * /
Day of month    YES         1-31                , - * ? / L W   //allowed '?'
Month           YES         1-12 or JAN-DEC     , - * /
Day of week     YES         1-7 or SUN-SAT      , - * ? / L #   //allowed '?'
Year            NO          empty, 1970-2099    , - * /

如您所见,这两个字段?仅在其中一个字段中是允许的,Day of month并且Day of week是必填字段,它将告诉Quartz该值尚未定义,因此,请使用另一个字段(如果?输入Day of month,则使用的值为Day of week)。