0%

Golang实现时间分割逻辑

数据库进行按月分库分表之后,最麻烦的就是查询一段时间内的数据。如果时间范围限定在同一个月之内还好说,直接查询就可以。

如果是跨月的情况,则需要先对时间范围进行划分,然后再分别去查询每个月的数据,最后将数据整合后返回。

下面列出两种对时间分隔的实现逻辑。

第一种:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
// 将时间分隔成每月
例:2021-09-22 16:00:00 -- 2021-12-01 15:59:59

结果:

2021-09-22 16:00:00 2021-09-30 23:59:59 202109
2021-10-01 00:00:00 2021-10-31 23:59:59 202110
2021-11-01 00:00:00 2021-11-30 23:59:59 202111
2021-12-01 00:00:00 2021-12-01 15:59:59 202112

*/
func GetMonInfo(t1, t2 time.Time) ([]MonInfo, bool) {
sameMonth := false
result := make([]MonInfo, 0)
// 先判断两个日期是否在同一个月
if t1.Format("200601") == t2.Format("200601") {
result = append(result, MonInfo{
StartDay: t1.Format("2006-01-02 15:04:05"),
EndDay: t2.Format("2006-01-02 15:04:05"),
MonStr: t2.Format("200601"),
})
sameMonth = true
} else {

// 获取第一个日期在当月的最后一天的23:59:59
endT1 := time.Date(t1.Year(), t1.Month()+1, 1, 0, 0, 0, -1, t1.Location())

result = append(result, MonInfo{
StartDay: t1.Format("2006-01-02 15:04:05"),
EndDay: endT1.Format("2006-01-02 15:04:05"),
MonStr: t1.Format("200601"),
})

// 将第一个日期的时间重置为当月的1号,防止增加1个月后得到的日期不是下月的1号
t1Tmp := time.Date(t1.Year(), t1.Month(), 1, 0, 0, 0, 0, t1.Location())

// 判断是否达到第二个日期
var i = 1
for {
t3 := t1Tmp.AddDate(0, i, 0)
// 判断是否到达第二个日期所在的月份
if t3.Format("200601") == t2.Format("200601") {
// 获取第二个日期在当月的第一天的起始时间
startT2 := time.Date(t2.Year(), t2.Month(), 1, 0, 0, 0, 0, t2.Location())

result = append(result, MonInfo{
StartDay: startT2.Format("2006-01-02 15:04:05"),
EndDay: t2.Format("2006-01-02 15:04:05"),
MonStr: t2.Format("200601"),
})
// 跳出
break
} else {
startT3 := time.Date(t3.Year(), t3.Month(), 1, 0, 0, 0, 0, t3.Location())
endT3 := time.Date(t3.Year(), t3.Month()+1, 1, 0, 0, 0, -1, t3.Location())
result = append(result, MonInfo{
StartDay: startT3.Format("2006-01-02 15:04:05"),
EndDay: endT3.Format("2006-01-02 15:04:05"),
MonStr: t3.Format("200601"),
})
}
i++

// 为了防止异常导致 for 循环无法停止出现内存溢出,加一个防护措施
if i > 12 {
break
}
}
}

return result, sameMonth
}

type MonInfo struct {
StartDay string
EndDay string
MonStr string
}

第二种:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
const (
LayoutDate = "2006-01-02 15:04:05"
LayoutMon = "200601"
LayoutDay = "20060102"
)

// 将时间分割成每天
func SplitDaysOfTask(startTime, endTime time.Time) (resDays []TaskDayInfo) {
resDays = make([]TaskDayInfo, 0)

if startTime.Format(LayoutDay) == endTime.Format(LayoutDay) {
resDays = append(resDays, TaskDayInfo{
StartTime: startTime,
EndTime: endTime,
Day: startTime.Format(LayoutDay),
Month: startTime.Format(LayoutMon),
})
} else {
endT1 := time.Date(startTime.Year(), startTime.Month(), startTime.Day()+1, 0, 0, 0, -1, startTime.Location())

resDays = append(resDays, TaskDayInfo{
StartTime: startTime,
EndTime: endT1,
Day: startTime.Format(LayoutDay),
Month: startTime.Format(LayoutMon),
})
var i = 1
for {

tNext := startTime.AddDate(0, 0, i)
startTNext := time.Date(tNext.Year(), tNext.Month(), tNext.Day(), 0, 0, 0, 0, tNext.Location())
if tNext.Format(LayoutDay) == endTime.Format(LayoutDay) {

resDays = append(resDays, TaskDayInfo{
StartTime: startTNext,
EndTime: endTime,
Day: startTNext.Format(LayoutDay),
Month: startTNext.Format(LayoutMon),
})
// 跳出
break
} else {
endTNext := time.Date(tNext.Year(), tNext.Month(), tNext.Day()+1, 0, 0, 0, -1, tNext.Location())

resDays = append(resDays, TaskDayInfo{
StartTime: startTNext,
EndTime: endTNext,
Day: startTNext.Format(LayoutDay),
Month: startTNext.Format(LayoutMon),
})
}

i++
// 超过2个月,直接跳出
if i > 60 {
break
}
}
}
return
}

type TaskDayInfo struct {
StartTime time.Time // 开始时间
EndTime time.Time // 结束时间
Day string // 当日日期
Month string // 所在月份
}

例: 2021-10-31 16:00:00 -- 2021-12-02 08:00:00

结果:

2021-10-31 16:00:00 -- 2021-10-31 23:59:59 -- 20211031 -- 202110
2021-11-01 00:00:00 -- 2021-11-01 23:59:59 -- 20211101 -- 202111
2021-11-02 00:00:00 -- 2021-11-02 23:59:59 -- 20211102 -- 202111
2021-11-03 00:00:00 -- 2021-11-03 23:59:59 -- 20211103 -- 202111
2021-11-04 00:00:00 -- 2021-11-04 23:59:59 -- 20211104 -- 202111
2021-11-05 00:00:00 -- 2021-11-05 23:59:59 -- 20211105 -- 202111
2021-11-06 00:00:00 -- 2021-11-06 23:59:59 -- 20211106 -- 202111
2021-11-07 00:00:00 -- 2021-11-07 23:59:59 -- 20211107 -- 202111
2021-11-08 00:00:00 -- 2021-11-08 23:59:59 -- 20211108 -- 202111
2021-11-09 00:00:00 -- 2021-11-09 23:59:59 -- 20211109 -- 202111
2021-11-10 00:00:00 -- 2021-11-10 23:59:59 -- 20211110 -- 202111
2021-11-11 00:00:00 -- 2021-11-11 23:59:59 -- 20211111 -- 202111
2021-11-12 00:00:00 -- 2021-11-12 23:59:59 -- 20211112 -- 202111
2021-11-13 00:00:00 -- 2021-11-13 23:59:59 -- 20211113 -- 202111
2021-11-14 00:00:00 -- 2021-11-14 23:59:59 -- 20211114 -- 202111
2021-11-15 00:00:00 -- 2021-11-15 23:59:59 -- 20211115 -- 202111
2021-11-16 00:00:00 -- 2021-11-16 23:59:59 -- 20211116 -- 202111
2021-11-17 00:00:00 -- 2021-11-17 23:59:59 -- 20211117 -- 202111
2021-11-18 00:00:00 -- 2021-11-18 23:59:59 -- 20211118 -- 202111
2021-11-19 00:00:00 -- 2021-11-19 23:59:59 -- 20211119 -- 202111
2021-11-20 00:00:00 -- 2021-11-20 23:59:59 -- 20211120 -- 202111
2021-11-21 00:00:00 -- 2021-11-21 23:59:59 -- 20211121 -- 202111
2021-11-22 00:00:00 -- 2021-11-22 23:59:59 -- 20211122 -- 202111
2021-11-23 00:00:00 -- 2021-11-23 23:59:59 -- 20211123 -- 202111
2021-11-24 00:00:00 -- 2021-11-24 23:59:59 -- 20211124 -- 202111
2021-11-25 00:00:00 -- 2021-11-25 23:59:59 -- 20211125 -- 202111
2021-11-26 00:00:00 -- 2021-11-26 23:59:59 -- 20211126 -- 202111
2021-11-27 00:00:00 -- 2021-11-27 23:59:59 -- 20211127 -- 202111
2021-11-28 00:00:00 -- 2021-11-28 23:59:59 -- 20211128 -- 202111
2021-11-29 00:00:00 -- 2021-11-29 23:59:59 -- 20211129 -- 202111
2021-11-30 00:00:00 -- 2021-11-30 23:59:59 -- 20211130 -- 202111
2021-12-01 00:00:00 -- 2021-12-01 23:59:59 -- 20211201 -- 202112
2021-12-02 00:00:00 -- 2021-12-02 08:00:00 -- 20211202 -- 202112
如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc