添加支持cron表达式
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
// 检查是否本周期可以运行
|
||||
// 检查是否本周期可以运行(已弃用,使用新的时间比较逻辑)
|
||||
// 保留此函数用于向后兼容,但建议使用新的时间计算逻辑
|
||||
|
||||
Reference in New Issue
Block a user