golang計算任意兩個時間點之間所覆蓋的天數

golang計算任意兩個時間點之間所覆蓋的天數

前言

有時候我們需要統計某個東西的日平均使用時長,我們就需要將一大段的使用時長拆分到天。

例子

  • 例子1
From: 2020-6-16 22:55:50
To:   2020-6-16 23:55:50

答案:天數應該是1天,duration是1小時

  • 例子2
From: 2020-6-16 22:55:50
To:   2020-6-17 00:01:56

答案:天數應該是2天,第一天的duration是4分10秒,第二天的duration是1分56秒

  • 例子3
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

小結

寫此博文只爲記錄在此以備忘。如能幫到一些小夥伴,那真是莫大的榮幸!如有更好的方式,歡迎小夥伴們留言,我將虛心學習!謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章