快速判断一个时间是否在当天的一些时间片段内
快速判断一个时间是否在当天的一些时间片段内

前言

在一些场景中,我们需要判断一个时间是否在当天的某些时间片段内,例如用电峰谷,有些场景下,当天的时间片段可能会很多, 用循环的方式去判断固然也能达到目的,但是当判断的时间流水过多的时候,这可能并不是一个好的方法

将一天的时间拆成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