不知道你在玩游戏的时候是否发现过以下情况:

  1. 玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次。
  2. 又比如很火的王者荣耀手游,它的日常任务,都是每天5点进行更新。

那么,这些时间控制,到底是由谁控制得如此精准呢?原来,这些都是corn表达式的功劳。


1. 了解 Cron 表达式

cron 表达式:由 若干数字、空格、符号 按一定的规则组成的一组字符串,从而表达时间的信息。类似于正则表达式。

cron 表达式结构

这个 cron 表达式字符串被 6 个空格分成了 7 个部分,标准格式:A B C D E F G。含义如下:

A 表示秒;B 表示分;C 表示小时;D 表示日;E 表示月;F 表示星期;G 表示年

cron 表达式中的 “G” 是可加可不加的,用得比较少,可以省略的。

2. Cron 表达式案例

  1. cron="0 */5 * * * ?":它的秒位为 0,表示每个 0 秒,分位为 */5,意思是每 5 分钟。所以总的来说,就是每 5 分钟(每5分0秒)时执行一次;
  2. cron="0 30 8,10,12 * * ?":它的秒位为0,分位为30,时位为一串集合,则它的意思是每天 8点半、10点半、12点半各执行一次;
  3. cron="0 0 */1 * * ?":它就是每个小时整点执行一次
  4. cron="0 0 9-18 * * MON-FRI":周一到周五的早上9点到晚上6点
  5. cron="0 0 14 L * ?":每个月最后一天,下午2点

3. Cron 表达式特殊字符

cron 表达式字符

  • *:代表所有可能的值
  • -:指定范围
  • ,:列出枚举 例如在分钟里,"5,15"表示5分钟和20分钟触发
  • /:指定增量 例如在分钟里,"3/15"表示从3分钟开始,每隔15分钟执行一次
  • ?:表示没有具体的值,使用 ? 要注意冲突
  • L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
  • W:只能用在月份中,表示最接近指定天的工作日
  • #:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五

示例

  • 0 * * * * ? 每1分钟触发一次
  • 0 0 * * * ? 每天每1小时触发一次
  • 0 0 10 * * ? 每天10点触发一次
  • 0 15 * * * ? 每个小时15分触发一次
  • 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
  • 0 30 9 1 * ? 每月1号上午9点半
  • 0 15 10 15 * ? 每月15日上午10:15触发
  • */5 * * * * ? 每隔5秒执行一次
  • 0 */1 * * * ? 每隔1分钟执行一次
  • 0 0 5-15 * * ? 每天5-15点整点触发
  • 0 0/3 * * * ? 每三分钟触发一次
  • 0 0 0 1 * ? 每月1号凌晨执行一次

在线 Corn 表达式生成器