You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:27:03