go时间段分周

本文最后更新于:2023年1月11日 下午

这段程序是受困于当初写数据统计时有个非常变态的周统计需求,所以做了一个关于ISO周划分的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package awesome

import "time"

type WeekDate struct {
ISOYear int
ISOWeek int
StartTime time.Time
EndTime time.Time
}

func groupByWeekDate(startTime, endTime time.Time) []WeekDate {
// Sunday -> Saturday 0,1,2,3,4,5,6
startOffset := int(time.Monday - startTime.Weekday())
// 只有Monday减去Sunday的时候是正数
if startOffset > 0 {
startOffset = -6
}
startMonday := startTime.AddDate(0, 0, startOffset)

endOffset := int(7 - endTime.Weekday())
if endOffset == 7 {
endOffset = 0
}
endSunday := endTime.AddDate(0, 0, endOffset)

var res = make([]WeekDate, 0)
for i := startMonday; i.Before(endSunday) || i.Equal(endSunday); i = i.AddDate(0, 0, 7) {
iISOYear, iISOWeek := i.ISOWeek()
var tmp = WeekDate{
ISOYear: iISOYear,
ISOWeek: iISOWeek,
StartTime: i,
EndTime: i.AddDate(0, 0, 6),
}
res = append(res, tmp)
}

return res
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!