如何对结构体中int64类型的时间戳字段进行区间数据过滤?
实现方案
核心逻辑是先把目标时间区间转换为和Create_time精度匹配的int64时间戳,再遍历数据集做范围筛选即可,示例代码如下:
package main import ( "time" ) // 你的原结构体定义 type Log struct { ID int `mapstructure:"id"` Create_time int64 `mapstructure:"create_time,omitempty"` } // FilterLogs 筛选符合时间范围的日志 func FilterLogs(logList []Log) []Log { // 1. 配置时区:如果你的时间戳是UTC标准时间,替换为 time.UTC 即可 timeZone, err := time.LoadLocation("Asia/Shanghai") if err != nil { // 时区加载失败可根据自己的业务逻辑做异常处理,示例此处直接返回空 return nil } // 2. 构造起止时间并转换为对应精度的时间戳 startTime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2021-10-24 00:00:00", timeZone) endTime, _ := time.ParseInLocation("2006-01-02 15:04:05", "2021-10-25 00:00:00", timeZone) // 注意:如果你的Create_time是毫秒级时间戳,此处替换为 .UnixMilli();微秒级替换为 .UnixMicro() startTs := startTime.Unix() endTs := endTime.Unix() // 3. 遍历筛选 var res []Log for _, item := range logList { if item.Create_time >= startTs && item.Create_time < endTs { res = append(res, item) } } return res }
注意事项
- 时区必须和
Create_time存储时使用的时区保持一致,否则会出现8小时的偏移误差 - 边界条件使用
>=开始时间、<结束时间,可以完整覆盖10月24日全天的所有数据,避免丢失临界时间的毫秒/微秒级数据 - 如果你的数据集量级特别大,可以考虑提前对
Create_time做排序,用二分查找进一步提升筛选效率
内容的提问来源于stack exchange,提问作者CharmCcc
相关产品推荐
相关产品推荐

