Files
streamsql/model/timeslot.go
2025-04-07 21:44:07 +08:00

53 lines
1.0 KiB
Go

package model
import (
"time"
)
type TimeSlot struct {
Start *time.Time
End *time.Time
}
func NewTimeSlot(start, end *time.Time) *TimeSlot {
return &TimeSlot{
Start: start,
End: end,
}
}
// Hash 生成槽位的哈希值
func (ts TimeSlot) Hash() uint64 {
// 将开始时间和结束时间转换为 Unix 时间戳(纳秒级)
startNano := ts.Start.UnixNano()
endNano := ts.End.UnixNano()
// 使用简单但高效的哈希算法
// 将两个时间戳组合成一个唯一的哈希值
hash := uint64(startNano)
hash = (hash << 32) | (hash >> 32)
hash = hash ^ uint64(endNano)
return hash
}
// Contains 检查给定时间是否在槽位范围内
func (ts TimeSlot) Contains(t time.Time) bool {
return (t.Equal(*ts.Start) || t.After(*ts.Start)) &&
t.Before(*ts.End)
}
func (ts *TimeSlot) GetStartTime() *time.Time {
if ts == nil || ts.Start == nil {
return nil
}
return ts.Start
}
func (ts *TimeSlot) GetEndTime() *time.Time {
if ts == nil || ts.End == nil {
return nil
}
return ts.End
}