Go语言时间范围内数组元素归一化问题排查与修正
银行交易记录时间归一化问题排查与修正
我需要将一批仅知晓发生日期的银行交易记录归一化到时间范围内:例如20条2022年1月1日的交易,要为它们分配具体的时分,使第一条为2022/01/01 00:00,最后一条为2022/01/01 23:59。
我用Go语言编写了如下归一化函数:
func normal(start, end time.Time, arraySize, index float64) time.Time { delta := end.Sub(start) minutes := delta.Minutes() duration := minutes * ((index+1) / arraySize) return start.Add(time.Duration(duration) * time.Minute) }
但运行出现异常:当数组大小为4、时间范围是2022/1/1 00:00到2022/1/1 23:59时,索引0的结果是2022/1/1 05:59,而非预期的00:00,仅索引3的结果符合预期。请问我的归一化逻辑哪里出错了?
编辑补充
感谢@icza提供的修正后的函数:
func timeIndex(min, max time.Time, entries, position float64) time.Time { delta := max.Sub(min) minutes := delta.Minutes() if position < 0 { position = 0 } duration := (minutes * (position / (entries - 1))) return min.Add(time.Duration(duration) * time.Minute) }
示例:时间范围为2022/01/01 00:00到2022/01/01 00:03,数组有3条记录,获取第3条(索引2)的归一化时间:
result := timeIndex(time.Date(2022, time.January, 1, 0, 0, 0, 0, time.UTC), time.Date(2022, time.January, 1, 0, 3, 0, 0, time.UTC), 3, 2)
此时结果应为2022/01/01 00:03,与结束时间一致。运行验证:
fmt.Printf("%t", result.Equal(time.Date(2022, time.January, 1, 0, 3, 0, 0, time.UTC))) // 输出 "true"
内容的提问来源于stack exchange,提问作者shackra
相关产品推荐
相关产品推荐

