添加支持cron表达式

This commit is contained in:
Yun
2025-10-05 16:30:41 +08:00
parent 27717c26be
commit 372033cfa3
10 changed files with 170 additions and 32 deletions
+38
View File
@@ -3,6 +3,8 @@ package timerx
import (
"errors"
"time"
"github.com/robfig/cron/v3"
)
// 计算该任务下次执行时间
@@ -32,6 +34,8 @@ func GetNextTime(t time.Time, job JobData) (*time.Time, error) {
next, err = calculateNextMinuteTime(t, job)
case JobTypeInterval:
next, err = calculateNextInterval(t, job)
case JobTypeCron:
next, err = calculateNextCronTime(t, job)
default:
return nil, errors.New("未知的任务类型: " + string(job.JobType))
}
@@ -73,6 +77,14 @@ func validateJobData(job JobData) error {
if job.BaseTime.IsZero() {
return ErrBaseTime
}
case JobTypeCron:
if job.CronExpression == "" {
return ErrCronExpression
}
_, err := calculateNextCronTime(time.Now(), job)
if err != nil {
return err
}
}
if job.Hour < 0 || job.Hour > 23 {
@@ -216,6 +228,32 @@ func calculateNextMinuteTime(t time.Time, job JobData) (*time.Time, error) {
return &nextMinuteTime, nil
}
// 计算cron任务下下次执行时间
func calculateNextCronTime(t time.Time, job JobData) (*time.Time, error) {
if job.CronExpression == "" {
return nil, ErrCronExpression
}
s := *job.CronSchedule
next := s.Next(t)
return &next, nil
}
func GetCronSche(CronExpression string, cronParser *cron.Parser) (*cron.Schedule, error) {
if CronExpression == "" {
return nil, ErrCronExpression
}
if cronParser == nil {
return nil, ErrCronParser
}
sche, err := cronParser.Parse(CronExpression)
if err != nil {
return nil, err
}
return &sche, nil
}
// 检查是否本周期可以运行
// 检查是否本周期可以运行(已弃用,使用新的时间比较逻辑)
// 保留此函数用于向后兼容,但建议使用新的时间计算逻辑