This commit is contained in:
2023-05-17 17:11:06 +08:00
parent 66828b2c23
commit b342ed0dbc
6 changed files with 215 additions and 40 deletions
+34 -14
View File
@@ -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
View File
@@ -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)