快速判断一个时间是否在当天的一些时间片段内
快速判断一个时间是否在当天的一些时间片段内
前言
在一些场景中,我们需要判断一个时间是否在当天的某些时间片段内,例如用电峰谷,有些场景下,当天的时间片段可能会很多, 用循环的方式去判断固然也能达到目的,但是当判断的时间流水过多的时候,这可能并不是一个好的方法
将一天的时间拆成1440分钟,每小时60分钟,分别用二进制标识,这样就可以形成一个60*24的矩阵,从而快速判断一个时间是否在 这个矩阵内
示例代码:
package main
import (
"fmt"
"time"
)
type Segment struct {
BeginTime string
EndTime string
}
type TimeSegments [24]uint64
func (s *TimeSegments) In(t time.Time) bool {
return s[t.Hour()]&(1<<t.Minute()) > 0
}
func SegmentData(timeSegment []Segment) *TimeSegments {
var data TimeSegments
for _, v := range timeSegment {
startMinute, endMinute := SegmentTime2Minute(v.BeginTime), SegmentTime2Minute(v.EndTime)
if startMinute > endMinute {
endMinute = 1440
}
for i := startMinute; i < endMinute; i++ {
data[i/60] |= 1 << (i % 60)
}
}
return &data
}
func SegmentTime2Minute(stringTime string) int {
t, _ := time.Parse("15:04", stringTime)
return t.Hour()*60 + t.Minute()
}
func main() {
data := SegmentData([]Segment{{
BeginTime: "02:08",
EndTime: "03:13",
}, {
BeginTime: "14:13",
EndTime: "18:00",
}})
for i := range data {
fmt.Printf("Data[%d]:%b\n", i, data[i])
}
now := time.Now()
for i := now; i.Before(now.AddDate(0, 0, 2)); i = i.Add(time.Minute) {
fmt.Printf("[%s]: %t \n", i, data.In(i))
}
}
Last modified on 2023-01-30