需求
生成留存率生成周期
package main
import (
"flag"
"fmt"
"regexp"
"strconv"
"strings"
"time"
)
const (
layoutISO = "2006/01/02 15:04:05"
)
var flagNow string
func init() {
flag.StringVar(&flagNow, "now", "", "set current time,if empty,will use now time")
flag.Parse()
}
func main() {
if len(flagNow) == 0 {
flagNow = time.Now().Format(layoutISO)
} else {
flagNow = strings.ReplaceAll(flagNow, "-", "/")
}
re := regexp.MustCompile(`(?P<year>\d{2,4})[\D]{1}(?P<month>\d{1,2})[\D]{1}(?P<day>\d{1,2})(\s+(?P<hour>\d{1,2}):(?P<min>\d{1,2}):(?P<sec>\d{1,2}))?`)
match := re.FindStringSubmatch(flagNow)
subMatchMap := make(map[string]int)
for i, name := range re.SubexpNames() {
if i != 0 && len(name) > 0 {
subMatchMap[name], _ = strconv.Atoi(match[i])
}
}
flagNow = fmt.Sprintf("%04d/%02d/%02d %02d:%02d:%02d",
subMatchMap["year"], subMatchMap["month"], subMatchMap["day"], subMatchMap["hour"], subMatchMap["min"], subMatchMap["sec"])
now, err := time.Parse(layoutISO, flagNow)
if err != nil {
panic(err)
}
fmt.Printf("now=%s %s (%d)\n", now.Format("2006/01/02 15:04:05"), now.Weekday(), int(now.Weekday()))
i := 0
for i < 20 {
start := time.Date(now.Year(), now.Month(), now.Day()-7*i-int(now.Weekday()), 0, 0, 0, 0, time.UTC)
end := time.Date(now.Year(), now.Month(), now.Day()-7*i+int(now.Weekday()), 23, 59, 59, 0, time.UTC)
fmt.Printf("%d) %s [%s] ~ %s [%s]\n", i,
start.Format("2006/01/02 15:04:05"), start.Weekday(),
end.Format("2006/01/02 15:04:05"), end.Weekday())
i++
}
}
测试
F:\mycode\go>go run genWeek.go --now "2020-11-11 12:30:05"
now=2020/11/11 12:30:05 Wednesday (3)
0) 2020/11/08 00:00:00 [Sunday] ~ 2020/11/14 23:59:59 [Saturday]
1) 2020/11/01 00:00:00 [Sunday] ~ 2020/11/07 23:59:59 [Saturday]
2) 2020/10/25 00:00:00 [Sunday] ~ 2020/10/31 23:59:59 [Saturday]
3) 2020/10/18 00:00:00 [Sunday] ~ 2020/10/24 23:59:59 [Saturday]
4) 2020/10/11 00:00:00 [Sunday] ~ 2020/10/17 23:59:59 [Saturday]
5) 2020/10/04 00:00:00 [Sunday] ~ 2020/10/10 23:59:59 [Saturday]
6) 2020/09/27 00:00:00 [Sunday] ~ 2020/10/03 23:59:59 [Saturday]
7) 2020/09/20 00:00:00 [Sunday] ~ 2020/09/26 23:59:59 [Saturday]
8) 2020/09/13 00:00:00 [Sunday] ~ 2020/09/19 23:59:59 [Saturday]
9) 2020/09/06 00:00:00 [Sunday] ~ 2020/09/12 23:59:59 [Saturday]
10) 2020/08/30 00:00:00 [Sunday] ~ 2020/09/05 23:59:59 [Saturday]
11) 2020/08/23 00:00:00 [Sunday] ~ 2020/08/29 23:59:59 [Saturday]
12) 2020/08/16 00:00:00 [Sunday] ~ 2020/08/22 23:59:59 [Saturday]
13) 2020/08/09 00:00:00 [Sunday] ~ 2020/08/15 23:59:59 [Saturday]
14) 2020/08/02 00:00:00 [Sunday] ~ 2020/08/08 23:59:59 [Saturday]
15) 2020/07/26 00:00:00 [Sunday] ~ 2020/08/01 23:59:59 [Saturday]
16) 2020/07/19 00:00:00 [Sunday] ~ 2020/07/25 23:59:59 [Saturday]
17) 2020/07/12 00:00:00 [Sunday] ~ 2020/07/18 23:59:59 [Saturday]
18) 2020/07/05 00:00:00 [Sunday] ~ 2020/07/11 23:59:59 [Saturday]
19) 2020/06/28 00:00:00 [Sunday] ~ 2020/07/04 23:59:59 [Saturday]