【GoCN酷Go推荐】 crontab 表达式解析库
共 5471字,需浏览 11分钟
·
2021-04-28 16:44
什么是cronexpr
cronexpr是一个高级的crontab解析表达式的库,用于解析比原生crontab更好强大的定时任务解析器,当然,这个包是不包含定时任务功能的
安装
GO MOD模式下,执行:
$ go get github.com/gorhill/cronexpr
案例
这个库实际上非常简单,我这里拿一个小的例子来展示一下
package main
import (
"fmt"
"github.com/gorhill/cronexpr"
"log"
"testing"
"time"
)
func TestCron(t *testing.T) {
_,nextTimeArr := CheckCrontabExpr("* * 10 * * * *")
for _,v := range nextTimeArr{
fmt.Println(v)
}
}
func CheckCrontabExpr(crontabs string) (err error, nextTimeArr []string) {
var nextTime []time.Time
if _, err = cronexpr.Parse(crontabs); err != nil {
log.Fatal(err)
return err, nil
}
//返回当前crontab后的5次执行,n为次数
nextTime = cronexpr.MustParse(crontabs).NextN(time.Now(), 5)
for _, v := range nextTime {
nextTimeArr = append(nextTimeArr, v.String())
}
return nil, nextTimeArr
}
上面的例子是打印这个crontab表达式“* * 10 * * * *”的后五次执行时间,结果如下:
=== RUN TestCron
2021-04-27 10:00:00 +0800 CST
2021-04-27 10:00:01 +0800 CST
2021-04-27 10:00:02 +0800 CST
2021-04-27 10:00:03 +0800 CST
2021-04-27 10:00:04 +0800 CST
--- PASS: TestCron (0.01s)
PASS
由于这个crontab表达式的最小粒度是秒,所以我们如果要自己写一个定时任务的话,可以用:
for{
var now = time.now()
nextDoCron := cronexpr.MustParse("* * 10 * * * *").Next(now)
if cronJob.nextTime.Before(now) || cronJob.nextTime.Equal(now)
......
......
select {
case <-time.NewTimer(1 * time.Second).C:
}
}
这样就只需要每秒检查一次,nextDoCron变量就是根据当前时间time.now()获取到的下一次执行时间
判断过期了或者刚好过期时,则执行if中的内容即可做到定时任务的功效
他的crontab表达式支持非常多的定义,这里我写个自己的总结:
/**
创建时间:2020-07-08 11:18:24
根据传入的表达式,检查表达式是否正确:
字段名 是否强制 支持的格式 支持的特殊格式
---------- ---------- -------------- --------------------
Seconds No 0-59 * / , -
Minutes Yes 0-59 * / , -
Hours Yes 0-23 * / , -
Day of month Yes 1-31 * / , - L W (L指最后last,若用L,表示月底,W指的是最近的工作日)
Month Yes 1-12 or JAN-DEC * / , -
Day of week Yes 0-6 or SUN-SAT * / , - L # (L指最后last,若用1L,表示本月最后一周的周一)
Year No 1970–2099 * / , -
00 */10 08-19 * * * * * 从08点到19点,每10分钟执行一次
2021-04-27 08:00:00 +0800 CST
2021-04-27 08:10:00 +0800 CST
2021-04-27 08:20:00 +0800 CST
2021-04-27 08:30:00 +0800 CST
2021-04-27 08:40:00 +0800 CST
00 00 17 * * 1-5 * 我们公司点加班餐的定时任务推送消息 周一到周五,每天的17点推送一次
2021-04-27 17:00:00 +0800 CST
2021-04-28 17:00:00 +0800 CST
2021-04-29 17:00:00 +0800 CST
2021-04-30 17:00:00 +0800 CST
2021-05-03 17:00:00 +0800 CST
*/
总结
cronexpr库实际上解决了我们自己去解析表达式的苦,我记得之前我用PHP写过一版crontab表达式解析,那叫一个心惊胆战,生怕自己写错造成生产事故,定时任务有很多种实现方式,这个库只是为我们解决了最基本也是最关键的表达式解析,推荐给大家,可以看看源码哟~
更多请查看:https://github.com/gorhill/cronexpr
欢迎加入我们GOLANG中国社区:https://gocn.vip/
《酷Go推荐》招募:
各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到新的库,并且知道怎么用。
大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:https://wj.qq.com/s2/7734329/3f51)
⚠️ 各位Gopher们,注意啦!
别忘了还有 Gopher China2021 大会
还没报名的童鞋们赶快抓住最后的机会!!!