不知道你在玩游戏的时候是否发现过以下情况:
- 玩某些游戏的时候,发现他的排行榜并不是时时更新的,而是每半个小时,或者一个小时更新一次。
- 又比如很火的王者荣耀手游,它的日常任务,都是每天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 表达式案例
-
cron="0 */5 * * * ?"
:它的秒位为 0,表示每个 0 秒,分位为 */5,意思是每 5 分钟。所以总的来说,就是每 5 分钟(每5分0秒)时执行一次; -
cron="0 30 8,10,12 * * ?"
:它的秒位为0,分位为30,时位为一串集合,则它的意思是每天 8点半、10点半、12点半各执行一次; -
cron="0 0 */1 * * ?"
:它就是每个小时整点执行一次 -
cron="0 0 9-18 * * MON-FRI"
:周一到周五的早上9点到晚上6点 -
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号凌晨执行一次