mirror of
https://github.com/YspCoder/clawgo.git
synced 2026-04-13 21:57:29 +08:00
54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package cron
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// SimpleCronParser is a minimal cron expression parser (minute hour day month dayOfWeek).
|
|
// It approximates standard cron behavior to provide missing Expr scheduling support.
|
|
type SimpleCronParser struct {
|
|
expr string
|
|
}
|
|
|
|
func NewSimpleCronParser(expr string) *SimpleCronParser {
|
|
return &SimpleCronParser{expr: expr}
|
|
}
|
|
|
|
func (p *SimpleCronParser) Next(from time.Time) time.Time {
|
|
fields := strings.Fields(p.expr)
|
|
if len(fields) != 5 {
|
|
return time.Time{} // Invalid format
|
|
}
|
|
|
|
// This minimal implementation only supports "*" and exact numbers.
|
|
// For production, use github.com/robfig/cron/v3.
|
|
next := from.Add(1 * time.Minute).Truncate(time.Minute)
|
|
|
|
// Simplified logic: if it is not "*" and does not match, keep incrementing until matched
|
|
// (up to one year of search).
|
|
for i := 0; i < 525600; i++ {
|
|
if p.match(next, fields) {
|
|
return next
|
|
}
|
|
next = next.Add(1 * time.Minute)
|
|
}
|
|
return time.Time{}
|
|
}
|
|
|
|
func (p *SimpleCronParser) match(t time.Time, fields []string) bool {
|
|
return matchField(fmt.Sprintf("%d", t.Minute()), fields[0]) &&
|
|
matchField(fmt.Sprintf("%d", t.Hour()), fields[1]) &&
|
|
matchField(fmt.Sprintf("%d", t.Day()), fields[2]) &&
|
|
matchField(fmt.Sprintf("%d", int(t.Month())), fields[3]) &&
|
|
matchField(fmt.Sprintf("%d", int(t.Weekday())), fields[4])
|
|
}
|
|
|
|
func matchField(val, field string) bool {
|
|
if field == "*" {
|
|
return true
|
|
}
|
|
return val == field
|
|
}
|