有时候我们需要统计某个东西的日平均使用时长,我们就需要将一大段的使用时长拆分到天。
From: 2020-6-16 22:55:50
To: 2020-6-16 23:55:50
答案:天数应该是1
天,duration是1小时
。
From: 2020-6-16 22:55:50
To: 2020-6-17 00:01:56
答案:天数应该是2
天,第一天的duration是4分10秒
,第二天的duration是1分56秒
。
From: 2020-6-16 22:55:50
To: 2020-6-18 10:01:56
答案:天数应该是3
天,第一天的duration是4分10秒
,第二天的duration是24小时
,第三天的duration是10小时1分56秒
。
1、根据起始的时间戳,得出是在哪一天d
;
2、然后计算出当天d
的午夜的时间戳t
;
3、拿午夜的时间戳t
与结束的时间戳作对比;
4、如果午夜的时间戳t >=
结束的时间戳,则说明停止时间就在d
那一天,否则是在d+1
天
5、后面每天依次类推。
func Days(timestampFrom, timestampTo int64) int {
var midnightUnix = func(t time.Time) int64 {
y, m, d := t.Date()
return time.Date(y, m, d+1, 0, 0, 0, 0, time.Local).Unix()
}
var days = 0
for {
if midnightUnix(time.Unix(timestampFrom, 0).AddDate(0, 0, days)) >= timestampTo {
days++
break
}
days++
}
return days
}
直接上验证代码:
func main() {
//test1
t1 := time.Date(2020, 6, 16, 22, 55, 50, 0, time.Local).Unix()
t2 := time.Date(2020, 6, 16, 23, 55, 50, 0, time.Local).Unix()
fmt.Printf("test1 days:%d\n", Days(t1, t2))
//test2
t3 := time.Date(2020, 6, 16, 22, 55, 50, 0, time.Local).Unix()
t4 := time.Date(2020, 6, 17, 0, 1, 56, 0, time.Local).Unix()
fmt.Printf("test2 days:%d\n", Days(t3, t4))
//test3
t5 := time.Date(2020, 6, 16, 22, 55, 50, 0, time.Local).Unix()
t6 := time.Date(2020, 6, 18, 10, 1, 56, 0, time.Local).Unix()
fmt.Printf("test2 days:%d\n", Days(t5, t6))
}
打印结果如下,与前面的设想一致。
test1 days:1
test2 days:2
test2 days:3
写此博文只为记录在此以备忘。如能帮到一些小伙伴,那真是莫大的荣幸!如有更好的方式,欢迎小伙伴们留言,我将虚心学习!谢谢!