func main() {

    l, _ := time.LoadLocation("Asia/Shanghai")
    startTime,_ := time.ParseInLocation("2006-01-02", "2018-12-22", l)
    endTime,_ := time.ParseInLocation("2006-01-02", "2019-05-17", l)

    datas := GroupByWeekDate(startTime, endTime)
    for _, d := range datas {
        fmt.Println(d)
    }

}

//判断时间是当年的第几周
func WeekByDate(t time.Time) string {
    yearDay := t.YearDay()
    yearFirstDay := t.AddDate(0, 0, -yearDay+1)
    firstDayInWeek := int(yearFirstDay.Weekday())

    //今年第一周有几天
    firstWeekDays := 1
    if firstDayInWeek != 0 {
        firstWeekDays = 7 - firstDayInWeek + 1
    }
    var week int
    if yearDay <= firstWeekDays {
        week =  1
    } else {
        week = (yearDay-firstWeekDays)/7 + 2
    }
    return fmt.Sprintf("%d第%d周", t.Year(), week)
}

type WeekDate struct {
    WeekTh    string
    StartTime time.Time
    EndTime   time.Time
}

// 将开始时间和结束时间分割为周为单位
func GroupByWeekDate(startTime, endTime time.Time) []WeekDate {
    weekDate := make([]WeekDate, 0)
    diffDuration := endTime.Sub(startTime)
    days := int(math.Ceil(float64(diffDuration / (time.Hour * 24))))+1

    currentWeekDate := WeekDate{}
    currentWeekDate.WeekTh = WeekByDate(endTime)
    currentWeekDate.EndTime = endTime
    currentWeekDay := int(endTime.Weekday())
    if currentWeekDay == 0 {
        currentWeekDay = 7
    }
    currentWeekDate.StartTime = endTime.AddDate(0, 0, -currentWeekDay+1)
    nextWeekEndTime := currentWeekDate.StartTime
    weekDate = append(weekDate, currentWeekDate)

    for i := 0; i < (days-currentWeekDay)/7; i++ {
        weekData := WeekDate{}
        weekData.EndTime = nextWeekEndTime
        weekData.StartTime = nextWeekEndTime.AddDate(0, 0, -7)
        weekData.WeekTh = WeekByDate(weekData.StartTime)
        nextWeekEndTime = weekData.StartTime
        weekDate = append(weekDate, weekData)
    }

    if lastDays := (days - currentWeekDay) % 7; lastDays > 0 {
        lastData := WeekDate{}
        lastData.EndTime = nextWeekEndTime
        lastData.StartTime = nextWeekEndTime.AddDate(0, 0, - lastDays)
        lastData.WeekTh = WeekByDate(lastData.StartTime)
        weekDate = append(weekDate, lastData)
    }

    return weekDate
}

输出结果如下


{2019第20周 2019-05-13 00:00:00 +0800 CST 2019-05-17 00:00:00 +0800 CST}
{2019第19周 2019-05-06 00:00:00 +0800 CST 2019-05-13 00:00:00 +0800 CST}
{2019第18周 2019-04-29 00:00:00 +0800 CST 2019-05-06 00:00:00 +0800 CST}
{2019第17周 2019-04-22 00:00:00 +0800 CST 2019-04-29 00:00:00 +0800 CST}
{2019第16周 2019-04-15 00:00:00 +0800 CST 2019-04-22 00:00:00 +0800 CST}
{2019第15周 2019-04-08 00:00:00 +0800 CST 2019-04-15 00:00:00 +0800 CST}
{2019第14周 2019-04-01 00:00:00 +0800 CST 2019-04-08 00:00:00 +0800 CST}
{2019第13周 2019-03-25 00:00:00 +0800 CST 2019-04-01 00:00:00 +0800 CST}
{2019第12周 2019-03-18 00:00:00 +0800 CST 2019-03-25 00:00:00 +0800 CST}
{2019第11周 2019-03-11 00:00:00 +0800 CST 2019-03-18 00:00:00 +0800 CST}
{2019第10周 2019-03-04 00:00:00 +0800 CST 2019-03-11 00:00:00 +0800 CST}
{2019第9周 2019-02-25 00:00:00 +0800 CST 2019-03-04 00:00:00 +0800 CST}
{2019第8周 2019-02-18 00:00:00 +0800 CST 2019-02-25 00:00:00 +0800 CST}
{2019第7周 2019-02-11 00:00:00 +0800 CST 2019-02-18 00:00:00 +0800 CST}
{2019第6周 2019-02-04 00:00:00 +0800 CST 2019-02-11 00:00:00 +0800 CST}
{2019第5周 2019-01-28 00:00:00 +0800 CST 2019-02-04 00:00:00 +0800 CST}
{2019第4周 2019-01-21 00:00:00 +0800 CST 2019-01-28 00:00:00 +0800 CST}
{2019第3周 2019-01-14 00:00:00 +0800 CST 2019-01-21 00:00:00 +0800 CST}
{2019第2周 2019-01-07 00:00:00 +0800 CST 2019-01-14 00:00:00 +0800 CST}
{2018第53周 2018-12-31 00:00:00 +0800 CST 2019-01-07 00:00:00 +0800 CST}
{2018第52周 2018-12-24 00:00:00 +0800 CST 2018-12-31 00:00:00 +0800 CST}
{2018第51周 2018-12-22 00:00:00 +0800 CST 2018-12-24 00:00:00 +0800 CST}
文档更新时间: 2019-11-25 16:02   作者:月影鹏鹏