}
var sets [5]uint64
+
for index, field := range fields {
set, err := scheduleCronField(field, scheduleCronFields[index].low, scheduleCronFields[index].high)
if err != nil {
// one day are not always in order. The first time is the
// smallest one.
var next time.Time
+
for hour := range 24 {
if c.hours&(1<<hour) == 0 {
continue
// and the minute fields, also across midnight.
func (c ScheduleCron) gap() int {
var times []int
+
for hour := range 24 {
for minute := range 60 {
if c.hours&(1<<hour) != 0 && c.minutes&(1<<minute) != 0 {
// high.
func scheduleCronField(field string, low, high int) (uint64, error) {
var set uint64
+
for item := range strings.SplitSeq(field, ",") {
base, stepText, stepped := strings.Cut(item, "/")
step := 1
if stepped {
var err error
+
step, err = scheduleCronNumber(stepText, 1, high)
if err != nil {
return 0, fmt.Errorf("the step of %q: %w", item, err)
case base == "*":
case ranged:
var err error
+
first, err = scheduleCronNumber(startText, low, high)
if err == nil {
last, err = scheduleCronNumber(endText, low, high)
return 0, fmt.Errorf("%q has a step after a single value: write a range N-M/S or */S", item)
default:
var err error
+
first, err = scheduleCronNumber(base, low, high)
if err != nil {
return 0, err