IILeeのBlog

IILeeのBlog

Cron 表达式详解

115
2022-05-09
Cron 表达式详解

前言

之前在配置 ip 黑名单的时候配置定时任务中需要编写 cron 表达式。

一个 cron 表达式最少有 5 个空格来分割时间元素,总共有 7 个元素,分别如下:

① 秒(0-59)
② 分钟(0-59)
③ 小时(0-23)
④ 天(月的第几天)(0-31,但是你需要考虑你月的天数)
⑤ 月(0-11)
⑥ 天(星期几)(1-7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
⑦ 年份(1970-2099)

说明:每个元素可以是

  • 一个具体的值(如 6)
  • 一个连续区间(9-12)
  • 一个间隔时间(0/5)(表示从 0 开始每隔 5,写到哪个元素就表示间隔的是哪个元素,如果写到了秒,那么表示从 0 秒开始,每隔 5 秒执行一次)
  • 一个列表(1,3,5)(表示第 1,3,5 时间执行,也是要根据写到了哪个元素上)
  • 通配符(,- * ? / L W #

image

举个例子

image

从注释里我们可以了解到:

第 1 个:它的秒位为 0,表示每个 0 秒,分位为 */5,意思是每 5 分钟。所以总的来说就是每 5 分钟(每 5 分 0 秒)时执行一次;

第 2 个:它的秒位为 0,分位为 30,时位为一串集合,则它的意思是每天 8 点半、10 点半、12 点半、14 点半、16 点半、21 点半各执行一次;

第 3 个:我想你已经知道它的意思了,没错,它就是每个小时整点(整点 0 分 0 秒)执行一次。

从上面三个列子中,我想你已经了解了 orcn 表达式的大致意思了:数字则表示具体时间,* 则表示任意时间,*/x 则表示每多少时间,还可以用集合表示具体的几个时间点。

用短横线(-)表示时间段:

比如:我们的上班时间朝 9 晚 6 为(周一到周五的早上 9 点到晚上 6 点),则 cron 表达式为:0 0 9-18 * * MON-FRI

星期一到星期天的英文为:MondayTuesdayWednesdayThursdayFridaySaturdaySunday ,取前三个字母,然后大写表示星期。

用 L 表示最后,L 是单词 Last(最后的)的首字母:

比如:假设每个最后一天,下午 2 点发工资的时间,则 cron 表达式为:0 0 14 L * ?

注:如果没有具体说明是星期几,通常用问号代替。

其他不常用的功能 #,W 这里不就介绍了,想知道的朋友可以自己去查阅资料,因为在实际工作中,用得极少。

而我们最常用的就是在某个时间点,或者某些时间点执行程序。

案例

一些 cron 表达式案例

*/5 * * * * ? 每隔 5 秒执行一次

0 */1 * * * ? 每隔 1 分钟执行一次

0 0 5-15 * * ? 每天 5-15 点整点触发

0 0/3 * * * ? 每三分钟触发一次

0 0-5 14 * * ? 在每天下午 2 点到下午 2:05 期间的每 1 分钟触发

0 0/5 14 * * ? 在每天下午 2 点到下午 2:55 期间的每 5 分钟触发

0 0/5 14,18 * * ? 在每天下午 2 点到 2:55 期间和下午 6 点到 6:55 期间的每 5 分钟触发

0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时

0 0 10,14,16 * * ? 每天上午 10 点,下午 2 点,4 点

0 0 12 ? * WED 表示每个星期三中午 12 点

0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点

0 10,44 14 ? 3 WED 每年三月的星期三的下午 2:10 和 2:44 触发

0 15 10 ? * MON-FRI 周一至周五的上午 10:15 触发

0 0 23 L * ? 每月最后一天 23 点执行一次

0 15 10 L * ? 每月最后一日的上午 10:15 触发

0 15 10 ? * 6L 每月的最后一个星期五上午 10:15 触发

0 15 10 * * ? 2005 2005 年的每天上午 10:15 触发

0 15 10 ? * 6L 2002-2005 2002 年至 2005 年的每月的最后一个星期五上午 10:15 触发

0 15 10 ? * 6#3 每月的第三个星期五上午 10:15 触发

30 * * * * ? 每半分钟触发任务

30 10 * * * ? 每小时的 10 分 30 秒触发任务

30 10 1 * * ? 每天 1 点 10 分 30 秒触发任务

30 10 1 20 * ? 每月 20 号 1 点 10 分 30 秒触发任务

30 10 1 20 10 ? * 每年 10 月 20 号 1 点 10 分 30 秒触发任务

30 10 1 20 10 ? 2011 2011 年 10 月 20 号 1 点 10 分 30 秒触发任务

30 10 1 ? 10 * 2011 2011 年 10 月每天 1 点 10 分 30 秒触发任务

30 10 1 ? 10 SUN 2011 2011 年 10 月每周日 1 点 10 分 30 秒触发任务

15,30,45 * * * * ? 每 15 秒,30 秒,45 秒时触发任务

15-45 * * * * ? 15 到 45 秒内,每秒都触发任务

15/5 * * * * ? 每分钟的每 15 秒开始触发,每隔 5 秒触发一次

15-30/5 * * * * ? 每分钟的 15 秒到 30 秒之间开始触发,每隔 5 秒触发一次

0 0/3 * * * ? 每小时的第 0 分 0 秒开始,每三分钟触发一次

0 15 10 ? * MON-FRI 星期一到星期五的 10 点 15 分 0 秒触发任务

0 15 10 L * ? 每个月最后一天的 10 点 15 分 0 秒触发任务

0 15 10 LW * ? 每个月最后一个工作日的 10 点 15 分 0 秒触发任务

0 15 10 ? * 5L 每个月最后一个星期四的 10 点 15 分 0 秒触发任务

0 15 10 ? * 5#3 每个月第三周的星期四的 10 点 15 分 0 秒触发任务

后记

原文地址 www.jianjunwen.com