【GoCN酷Go推薦】 crontab 表達(dá)式解析庫
什么是cronexpr
cronexpr是一個(gè)高級(jí)的crontab解析表達(dá)式的庫,用于解析比原生crontab更好強(qiáng)大的定時(shí)任務(wù)解析器,當(dāng)然,這個(gè)包是不包含定時(shí)任務(wù)功能的
安裝
GO MOD模式下,執(zhí)行:
$ go get github.com/gorhill/cronexpr
案例
這個(gè)庫實(shí)際上非常簡單,我這里拿一個(gè)小的例子來展示一下
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
}
//返回當(dāng)前crontab后的5次執(zhí)行,n為次數(shù)
nextTime = cronexpr.MustParse(crontabs).NextN(time.Now(), 5)
for _, v := range nextTime {
nextTimeArr = append(nextTimeArr, v.String())
}
return nil, nextTimeArr
}
上面的例子是打印這個(gè)crontab表達(dá)式“* * 10 * * * *”的后五次執(zhí)行時(shí)間,結(jié)果如下:
=== 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
由于這個(gè)crontab表達(dá)式的最小粒度是秒,所以我們?nèi)绻约簩懸粋€(gè)定時(shí)任務(wù)的話,可以用:
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變量就是根據(jù)當(dāng)前時(shí)間time.now()獲取到的下一次執(zhí)行時(shí)間
判斷過期了或者剛好過期時(shí),則執(zhí)行if中的內(nèi)容即可做到定時(shí)任務(wù)的功效
他的crontab表達(dá)式支持非常多的定義,這里我寫個(gè)自己的總結(jié):
/**
創(chuàng)建時(shí)間:2020-07-08 11:18:24
根據(jù)傳入的表達(dá)式,檢查表達(dá)式是否正確:
字段名 是否強(qiáng)制 支持的格式 支持的特殊格式
---------- ---------- -------------- --------------------
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點(diǎn)到19點(diǎn),每10分鐘執(zhí)行一次
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 * 我們公司點(diǎn)加班餐的定時(shí)任務(wù)推送消息 周一到周五,每天的17點(diǎn)推送一次
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
*/
總結(jié)
cronexpr庫實(shí)際上解決了我們自己去解析表達(dá)式的苦,我記得之前我用PHP寫過一版crontab表達(dá)式解析,那叫一個(gè)心驚膽戰(zhàn),生怕自己寫錯(cuò)造成生產(chǎn)事故,定時(shí)任務(wù)有很多種實(shí)現(xiàn)方式,這個(gè)庫只是為我們解決了最基本也是最關(guān)鍵的表達(dá)式解析,推薦給大家,可以看看源碼喲~
更多請(qǐng)查看:https://github.com/gorhill/cronexpr
歡迎加入我們GOLANG中國社區(qū):https://gocn.vip/
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫或者好的項(xiàng)目,然后寫一點(diǎn)這個(gè)庫使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到新的庫,并且知道怎么用。
大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名?。▓?bào)名地址:https://wj.qq.com/s2/7734329/3f51)

?? 各位Gopher們,注意啦!
別忘了還有 Gopher China2021 大會(huì)
還沒報(bào)名的童鞋們趕快抓住最后的機(jī)會(huì)?。。?/strong>

