我正在try 将时间范围内的元素数组正常化.假设您有20笔发生在2022年1月1日的银行交易
transaction 1 - 2022/01/01
transaction 2 - 2022/01/01
...
transaction 20 - 2022/01/01
除了它们发生的日期之外,我们没有其他数据,但我们仍然希望为它们分配一天中的一个小时,因此它们的结尾为:
transaction 1 - 2022/01/01 00:00
transaction 2 - 2022/01/01 ??:??
...
transaction 20 - 2022/01/01 23:59
在Go中,我有这个函数,它try 计算元素数组中索引的归一化时间:
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)
}
但是,对于从2022/1/1 00:00到2022/1/1 23:59的时间范围内的4个元素的数组中的索引0,我得到了一个意外的计算结果2022/1/1 05:59,而我希望看到的是2022/1/1 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个条目,我们想要获得交易n: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)
由于开始时间和结束时间(从00:00
到00:03
)之间只有4分钟,并且想要找到数组(大小3
)中最后一个条目(索引2
)的归一化时间,因此结果应该是:
fmt.Printf("%t", result.Equal(time.Date(2022, time.January, 1, 0, 3, 0, 0, time.UTC))
// prints "true"
或者是最后一分钟,也就是00:03
分.
下面是一个可重复使用的例子:https://go.dev/play/p/EzwkqaNV1at