Golang如何解析cron表达式获取时间日期并完成时间范围判断
Go语言Cron表达式解析及时间校验方案
核心思路
- cron表达式是定时调度规则,本身不对应单个固定日期,需要先解析得到调度实例,再获取其触发的时间点进行校验
- 常用的
robfig/cron包默认解析器不支持秒级,你给出的是6位带秒的cron格式,需要手动指定参数开启秒级解析 - 解析得到
Schedule实例后,通过Next()方法获取具体触发的time.Time类型时间,提取时分字段做区间校验即可
代码实现
package main import ( "fmt" "time" "github.com/robfig/cron/v3" ) // CheckCronTriggerInRange 校验cron所有触发时间是否都落在00:00~00:06区间 func CheckCronTriggerInRange(cronStr string) (bool, error) { // 初始化支持秒级的cron解析器,适配6位cron格式 parser := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.DowOptional) schedule, err := parser.Parse(cronStr) if err != nil { return false, err } // 校验最近10次触发时间覆盖所有可能的周期场景 nextTime := time.Now() for i := 0; i < 10; i++ { nextTime = schedule.Next(nextTime) hour := nextTime.Hour() minute := nextTime.Minute() // 只要有一次触发不在目标区间就返回false if hour != 0 || minute < 0 || minute > 6 { return false, nil } } return true, nil } func main() { cronExpr := "0 3,10,16,22 * * ?" result, err := CheckCronTriggerInRange(cronExpr) if err != nil { fmt.Printf("cron解析失败:%v\n", err) return } fmt.Println("校验结果:", result) }
结果说明
你提供的cron表达式0 3,10,16,22 * * ?的触发规则为:每天的03:00、10:00、16:00、22:00整触发,所有触发时间均不落在00:00~00:06区间内,运行上述代码会返回false,符合你的需求。
内容的提问来源于stack exchange,提问作者Muhamad Fadhil Surya Putra
相关产品推荐
相关产品推荐

