2 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果我們將“一天中的秒數(shù)”定義為“自午夜以來(lái)經(jīng)過(guò)的秒數(shù)”,那么即使在夏令時(shí)發(fā)生的日子里,為了獲得正確的結(jié)果,我們也應(yīng)該從給定時(shí)間中減去代表午夜的時(shí)間。為此,我們可以使用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())
}
測(cè)試它:
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
讓我們看看這個(gè)函數(shù)如何在夏令時(shí)發(fā)生時(shí)給出正確的結(jié)果。在匈牙利,2018 年 3 月 25 日是時(shí)鐘02:00:00從2 am轉(zhuǎn)到1 小時(shí)的一天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 秒的時(shí)間,這是30當(dāng)然的。然后我們將時(shí)間加上 2 小時(shí)(2 小時(shí) = 2*3600 秒 = 7200),這個(gè)daySeconds新時(shí)間的時(shí)間將是正確的7200 + 30 = 7230,即使時(shí)間更改為 3 小時(shí)。

TA貢獻(xiàn)1963條經(jīng)驗(yàn) 獲得超6個(gè)贊
注意:?此函數(shù)返回 (0 - 86399) 范圍內(nèi)一天中的標(biāo)稱秒數(shù)。如果您正在尋找“自午夜以來(lái)經(jīng)過(guò)的秒數(shù)”,由于夏令時(shí)可能不在 (0 - 86399) 范圍內(nèi),請(qǐng)參閱@icza 的回答。
它似乎對(duì)應(yīng)于名義秒數(shù)實(shí)現(xiàn)(如我在下面的回答中)而不是“數(shù)量自午夜以來(lái)經(jīng)過(guò)的秒數(shù)”(如@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 關(guān)注
- 285 瀏覽
添加回答
舉報(bào)