GoLang生成留存率时间周期

需求

生成留存率生成周期

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值