package crontab import ( "errors" "fmt" "strconv" "strings" ) type timePointer struct { left, right int leftlimit, rightlimit int per int isAll bool } func (tp *timePointer) String() string { return fmt.Sprintf("left: %d, right: %d, leftlimit: %d, rightlimit: %d, per: %d", tp.left, tp.right, tp.leftlimit, tp.rightlimit, tp.per) } func createTimePointer(min string, llimit, rlimit int, fixedLeftRight bool) []timePointer { var result []timePointer exelist := strings.Split(min, ",") for _, exe := range exelist { tp := timePointer{} takeper := strings.Split(exe, "/") // per var rangevalue, per string if len(takeper) == 1 { rangevalue = exe per = "1" } else { rangevalue = takeper[0] per = takeper[1] } // takeRange be := strings.Split(rangevalue, "-") var left, rigth string switch len(be) { case 1: left = be[0] rigth = be[0] case 2: left = be[0] rigth = be[1] default: panic(errors.New("range value is > 2")) } if left == "*" { tp.left = llimit } else { ileft, err := strconv.Atoi(strings.Replace(left, "^", "-", -1)) if err != nil { panic(err) } tp.left = ileft } if rigth == "*" { tp.right = rlimit } else { iright, err := strconv.Atoi(strings.Replace(rigth, "^", "-", -1)) if err != nil { panic(err) } tp.right = iright } iper, err := strconv.Atoi(per) if err != nil { panic(err) } tp.per = iper tp.leftlimit = llimit tp.rightlimit = rlimit // 修正左值 leftfixed := tp.left if leftfixed < 0 { leftfixed += tp.rightlimit + 1 if fixedLeftRight { tp.left = leftfixed } } rightfixed := tp.right if rightfixed < 0 { rightfixed += tp.rightlimit + 1 if fixedLeftRight { tp.right = rightfixed } } // 全部符合 当左等于左 且 右等于右最大 并且 per == 1 if leftfixed == tp.leftlimit && rightfixed == tp.rightlimit && tp.per == 1 { tp.isAll = true } result = append(result, tp) } return result }