32 lines
671 B
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
|
|
}
|