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 关注
- 217 浏览
添加回答
举报