Go语言中定时器cron的基本使用教程

2020-01-28 12:56:02刘景俊

当然简洁是好的,但简洁的同时往往也有些无法做到简洁的情况,比如上面提到的:


@every 1h30m

不用后缀是不行了吧?

最不好理解的可能是以下的表达式了,因为看这种表达式,就好比看一堆正则表达式一样,让一般人懵逼:


c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })

定时表达式 0 30 * * * * 到底是什么意思啊?第一印象,毫无规律性,不知道什么意思,如果翻译 Every hour on the half hour 这句洋文,倒是有点概念了,意思就是“每一小时半(1.5个小时)执行一次” 嘛!!!

额,看到0 30和六个占位数,推理一下:是不是 秒 分 时 天 月 年 啊?似乎有眉毛了,我也想知道这个表达式的具体使用办法,只能下次认真学习后,一起说道说道了。

Go 定时器 cron 表达式的使用

如果想更灵活的使用定时,可能会涉及到更复杂的六位表达式的使用方法,如每半小时执行一次:


0 30 * * * *

六位的表达式看起来,有点费解,好比正则表达式一样,我们需要按步骤来理解;

理解六个作用域的意义


0 0 0 1 1 *
0 0 0 1 * *
0 0 0 * * 0
0 0 0 * * *
0 0 * * * *

如上表达式,都是六位占位符,可以是数字和字符,其中字符是特定字符包括:【* / , - ? JAN-DEC SUN-SAT】

我们叫它为六个作用域吧,从左到右的顺序,代表的含义是 秒钟域(1) 分钟域(2) 小时域(3) 日期域(4) 月份域(5) 星期域(6)

月份域可以使用 JAN-DEC 和星期域可以使用SUN-SAT,分别表示 1-12月的英文缩写和星期一至星期日的英文简写,如果不了解月份和星期英文简写,建议使用数字表示,因为这个需要记忆和大小写敏感的,容易出错。

下面列出方便理解:

1至12月份的英文简写:Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec

星期一至星期日的英文简写:Mon Tues Wed Thurs Fri Sat Sun

六个作用域还可以使用的特定字符:

特定字符星号( *)

星号表示匹配所有合理的值,可以存在任何域。比如第月份域(5)的位置使用星号*,表示每个月都执行;同理在星期域(6)的位置使用星号,表示每个星期都执行;其他占位使用它以此类推。

特定字符斜划线 (/)

斜划线通常用于一个范围增量,可以存在任何域。比如在分钟域(2)的位置使用 3-59/15 表示一个小时的第3分钟到59分钟时间范围内,每15分钟执行一次。

特定字符逗号 (,)

逗号用于分隔多个点,可以存在任何域。比如在星期域(6)的位置使用 MON,WED,FRI 表示星期一、星期三、星期五这三个点都满足条件。