2 回答

TA貢獻1810條經驗 獲得超4個贊
如果我們將“一天中的秒數”定義為“自午夜以來經過的秒數”,那么即使在夏令時發生的日子里,為了獲得正確的結果,我們也應該從給定時間中減去代表午夜的時間。為此,我們可以使用Time.Sub()
.
func daySeconds(t time.Time) int {
? ? year, month, day := t.Date()
? ? t2 := time.Date(year, month, day, 0, 0, 0, 0, t.Location())
? ? return int(t.Sub(t2).Seconds())
}
測試它:
for _, t := range []time.Time{
? ? time.Date(2019, 1, 1, 0, 0, 30, 0, time.UTC),
? ? time.Date(2019, 1, 1, 0, 1, 30, 0, time.UTC),
? ? time.Date(2019, 1, 1, 0, 12, 30, 0, time.UTC),
? ? time.Date(2019, 1, 1, 12, 12, 30, 0, time.UTC),
} {
? ? fmt.Println(daySeconds(t))
}
輸出(在Go Playground上嘗試):
30
90
750
43950
讓我們看看這個函數如何在夏令時發生時給出正確的結果。在匈牙利,2018 年 3 月 25 日是時鐘02:00:00從2 am轉到1 小時的一天3 am。
loc, err := time.LoadLocation("CET")
if err != nil {
? ? fmt.Println(err)
? ? return
}
t := time.Date(2018, 3, 25, 0, 0, 30, 0, loc)
fmt.Println(t)
fmt.Println(daySeconds(t))
t = t.Add(2 * time.Hour)
fmt.Println(t)
fmt.Println(daySeconds(t))
此輸出(在Go Playground上嘗試):
2018-03-25 00:00:30 +0100 CET
30
2018-03-25 03:00:30 +0200 CEST
7230
我們打印daySeconds午夜后 30 秒的時間,這是30當然的。然后我們將時間加上 2 小時(2 小時 = 2*3600 秒 = 7200),這個daySeconds新時間的時間將是正確的7200 + 30 = 7230,即使時間更改為 3 小時。

TA貢獻1963條經驗 獲得超6個贊
注意:?此函數返回 (0 - 86399) 范圍內一天中的標稱秒數。如果您正在尋找“自午夜以來經過的秒數”,由于夏令時可能不在 (0 - 86399) 范圍內,請參閱@icza 的回答。
它似乎對應于名義秒數實現(如我在下面的回答中)而不是“數量自午夜以來經過的秒數”(如@icza 的回答)。
package main?
import (
? ? "fmt"
? ? "time"
)
func getSecondOfDay(t time.Time) int {
? ? return 60*60*t.Hour() + 60*t.Minute() + t.Second()
}
func main() {
? ? t := time.Now()
? ? fmt.Println(getSecondOfDay(t))
}
- 2 回答
- 0 關注
- 275 瀏覽
添加回答
舉報