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

2022-09-01 06:03:09

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

0 0 0/1 1/1 * ? *

你知道吗?我不知道这是什么意思。写这篇文章的人在接下来的2周里正在度假,所以我必须自己找出答案。文档可以在这里找到

根据文档,我们有:

* * * * * * *
| | | | | | | 
| | | | | | +-- 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 Dev,他一定知道编写此类表达式的任何原因,而不是:

0 0 * * * * *

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

简短摘要

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

编辑:

在此处找到文档。


答案 1

0/1表示从小时开始,重复每个小时
都是从当月的第一天开始,每天执行011/11

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

需要使用 or 之一:
支持同时指定星期几和月中的某一天的值不完整(您当前必须在其中一个字段中使用''字符)。– xenteros 7分钟前?dayOfWeekdayOfMonth?

然后,(而不是,正如您所评论的那样,强制)将是相同的表达式,忽略秒和分钟并获取其他元素的每个值,将每小时和每天执行一次。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”表示“从当月的第一天开始每 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    , - * /

如您所见,在两个字段中只允许并且是必需的,并且会告诉Quartz此值尚未定义,因此,请使用另一个字段(如果您输入,则使用的值将是)。?Day of monthDay of week?Day of monthDay of week


答案 2

和 之间没有实际区别0 0 * * * ? *0 0 0/1 1/1 * ? *

分析不同的标记:
和小时 - 第一个表示每天从小时0开始,每小时重复一次,第二个表示:每小时重复一次
,几天 - 第一个表示从月份的第一天开始,每天重复,第二个表示每天。0/1*1/1*

有人使用复杂表达式的原因可能是通过测试,表达式评估为这种形式,没有人承担简化它的工作,或者以前的cron版本可能工作不同。


推荐