thread-master/internal/model/job/cron/next_run.go

32 lines
671 B
Go

package cron
import (
"fmt"
"time"
"haixun-backend/internal/library/clock"
"github.com/robfig/cron/v3"
)
func NextRunAt(cronExpr, timezone string, from time.Time) (int64, error) {
expr := cronExpr
parser := cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
schedule, err := parser.Parse(expr)
if err != nil {
return 0, fmt.Errorf("invalid cron expression: %w", err)
}
loc := time.UTC
if timezone != "" {
loaded, loadErr := time.LoadLocation(timezone)
if loadErr != nil {
return 0, fmt.Errorf("invalid timezone: %w", loadErr)
}
loc = loaded
}
next := schedule.Next(from.In(loc))
return clock.UnixNano(next), nil
}