33 lines
875 B
Go
33 lines
875 B
Go
package gronx
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// PrevTick gives previous run time before now
|
|
func PrevTick(expr string, inclRefTime bool) (time.Time, error) {
|
|
return PrevTickBefore(expr, time.Now(), inclRefTime)
|
|
}
|
|
|
|
// PrevTickBefore gives previous run time before given reference time
|
|
func PrevTickBefore(expr string, start time.Time, inclRefTime bool) (time.Time, error) {
|
|
gron, prev := New(), start.Truncate(time.Second)
|
|
due, err := gron.IsDue(expr, start)
|
|
if err != nil || (due && inclRefTime) {
|
|
return prev, err
|
|
}
|
|
|
|
segments, _ := Segments(expr)
|
|
if len(segments) > 6 && isUnreachableYear(segments[6], prev, inclRefTime, true) {
|
|
return prev, fmt.Errorf("unreachable year segment: %s", segments[6])
|
|
}
|
|
|
|
prev, err = loop(gron, segments, prev, inclRefTime, true)
|
|
// Ignore superfluous err
|
|
if err != nil && gron.isDue(expr, prev) {
|
|
err = nil
|
|
}
|
|
return prev, err
|
|
}
|