update
This commit is contained in:
+34
-14
@@ -13,9 +13,10 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
str = transChn(str)
|
||||
var rpt startimer.Repeats
|
||||
var duration time.Duration
|
||||
reg := regexp.MustCompile(`(每隔|每)?(\d{1,4}年)?(\d{1,5}个?月)?(\d{1,4}[明后大]{0,4}[日号天])?([上中下午夜早凌清晨傍晚里]+)?(\d{1,4}个?[点小时钟:]+)?(\d{1,4}[分:])?(\d{1,10}秒?)?(后)?`)
|
||||
reg := regexp.MustCompile(`(每隔|每)?(\d{0,4}年)?(\d{0,5}个?月)?(\d{0,4}[明后大]{0,4}[日号天])?([上中下午夜早凌清晨傍晚里]+)?(\d{1,4}个?[点小时钟:]+)?(\d{1,4}[分:])?(\d{1,10}秒?)?(后)?`)
|
||||
if reg.MatchString(str) {
|
||||
pts := reg.FindStringSubmatch(str)
|
||||
setAsDate := false
|
||||
var timeParse = pts[5]
|
||||
count := 1
|
||||
if pts[1] != "" {
|
||||
@@ -26,19 +27,31 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
if !rpt.Every {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_YEAR, Value: uint32(getNumbers(pts[2]))})
|
||||
} else {
|
||||
duration += time.Hour * 24 * 365 * time.Duration(getNumbers(pts[2]))
|
||||
if getNumbers(pts[2]) == 0 {
|
||||
setAsDate = true
|
||||
} else {
|
||||
duration += time.Hour * 24 * 365 * time.Duration(getNumbers(pts[2]))
|
||||
}
|
||||
}
|
||||
}
|
||||
if pts[3] != "" {
|
||||
if !rpt.Every {
|
||||
if !rpt.Every || setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_MONTH, Value: uint32(getNumbers(pts[3]))})
|
||||
} else {
|
||||
duration += time.Hour * 24 * 30 * time.Duration(getNumbers(pts[3]))
|
||||
if getNumbers(pts[3]) == 0 {
|
||||
setAsDate = true
|
||||
} else {
|
||||
duration += time.Hour * 24 * 30 * time.Duration(getNumbers(pts[3]))
|
||||
}
|
||||
}
|
||||
}
|
||||
if pts[4] != "" {
|
||||
now := time.Now()
|
||||
switch pts[4] {
|
||||
case "天":
|
||||
if rpt.Every {
|
||||
setAsDate = true
|
||||
}
|
||||
case "明天":
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 24).Day())})
|
||||
case "后天":
|
||||
@@ -48,27 +61,28 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
case "大大后天":
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 96).Day())})
|
||||
default:
|
||||
if !rpt.Every {
|
||||
if setAsDate == rpt.Every {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(getNumbers(pts[4]))})
|
||||
} else {
|
||||
duration += time.Hour * 24 * time.Duration(getNumbers(pts[4]))
|
||||
}
|
||||
}
|
||||
}
|
||||
setAsDate := false
|
||||
|
||||
if rpt.Every && timeParse != "" {
|
||||
setAsDate = true
|
||||
} else if rpt.Every && !strings.Contains(pts[6], "小时") {
|
||||
setAsDate = true
|
||||
base = time.Date(base.Year(), base.Month(), base.Day(), 0, 0, 0, 0, base.Location())
|
||||
}
|
||||
//else if rpt.Every && !strings.Contains(pts[6], "小时") {
|
||||
// setAsDate = true
|
||||
// base = time.Date(base.Year(), base.Month(), base.Day(), 0, 0, 0, 0, base.Location())
|
||||
// }
|
||||
var hour uint32
|
||||
if pts[6] != "" {
|
||||
hour = uint32(getNumbers(pts[6]))
|
||||
if timeParse == "下午" || strings.Contains(timeParse, "晚") || strings.Contains(timeParse, "夜") {
|
||||
hour += 12
|
||||
}
|
||||
if !setAsDate && !rpt.Every {
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_HOUR, Value: hour})
|
||||
} else if rpt.Every && !setAsDate {
|
||||
duration += time.Hour * time.Duration(hour)
|
||||
@@ -99,7 +113,7 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
}
|
||||
}
|
||||
if pts[7] != "" {
|
||||
if !setAsDate && !rpt.Every {
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_MINUTE, Value: uint32(getNumbers(pts[7]))})
|
||||
} else if rpt.Every && !setAsDate {
|
||||
duration += time.Minute * time.Duration(uint32(getNumbers(pts[7])))
|
||||
@@ -107,13 +121,13 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
base.Add(time.Minute * time.Duration(uint32(getNumbers(pts[7]))))
|
||||
}
|
||||
} else if hour != 0 {
|
||||
if !rpt.Every && !setAsDate {
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_MINUTE, Value: 0})
|
||||
}
|
||||
}
|
||||
|
||||
if pts[8] != "" {
|
||||
if !setAsDate && !rpt.Every {
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_SECOND, Value: uint32(getNumbers(pts[8]))})
|
||||
} else if rpt.Every && !setAsDate {
|
||||
duration += time.Second * time.Duration(uint32(getNumbers(pts[8])))
|
||||
@@ -121,7 +135,7 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
base.Add(time.Second * time.Duration(uint32(getNumbers(pts[8]))))
|
||||
}
|
||||
} else if hour != 0 {
|
||||
if !rpt.Every && !setAsDate {
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_SECOND, Value: 0})
|
||||
}
|
||||
}
|
||||
@@ -151,6 +165,9 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro
|
||||
if duration.Seconds() > 0 {
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_SECOND, Value: uint32(duration.Seconds())})
|
||||
}
|
||||
if rpt.Every == setAsDate {
|
||||
rpt.Every = false
|
||||
}
|
||||
return startimer.NewTimer(base, startimer.WithRepeats(&rpt), startimer.WithRunCountLimit(count)), nil
|
||||
}
|
||||
return startimer.StarTimer{}, errors.New("no Match")
|
||||
@@ -182,6 +199,9 @@ func matchPeroidPattern02(base time.Time, str string) (startimer.StarTimer, erro
|
||||
}
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_WEEK, Value: uint32(num)})
|
||||
}
|
||||
} else {
|
||||
wkNum := getNumbers(wk)
|
||||
rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_WEEK, Value: uint32(wkNum)})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+11
-2
@@ -8,8 +8,17 @@ import (
|
||||
|
||||
func TestParse(t *testing.T) {
|
||||
for _, code := range []string{"一个小时后告诉我事情", "三个小时后爱我", "每两个小时提醒我吃饭",
|
||||
"每五个月零二十五天三小时25分15秒告诉我时间", "5月23日上午3点24分12秒打我", "周四上午11点提醒我",
|
||||
"每周一到周五上午8点提醒我吃饭"} {
|
||||
"每五个月零二十五天三小时25分15秒告诉我时间", "5月23日上午3点24分12秒打我", "周五上午11点提醒我", "5时25分提醒我",
|
||||
"每周一到周五上午8点提醒我吃饭", "每天晚上8点提醒我吃饭", "每月16号晚上8点提醒我吃饭"} {
|
||||
a, _ := WhenWithPeriod(code)
|
||||
//fmt.Println(a.Repeats()[0])
|
||||
fmt.Println(a.NextTimer(), a.RunCountLimit(), code)
|
||||
fmt.Println(a.NextTimerAfterDate(time.Now().Add(time.Hour * 72)))
|
||||
}
|
||||
}
|
||||
|
||||
func TestSigParse(t *testing.T) {
|
||||
for _, code := range []string{"每月16号晚上8点提醒我吃饭"} {
|
||||
a, _ := WhenWithPeriod(code)
|
||||
//fmt.Println(a.Repeats()[0])
|
||||
fmt.Println(a.NextTimer(), a.RunCountLimit(), code)
|
||||
|
||||
Reference in New Issue
Block a user