如何在Go中获取一天中的秒数(1-86400)?
就像http://joda-time.sourceforge.net/apidocs/org/joda/time/base/AbstractDateTime.html#getSecondOfDay()
更新/说明
答案 0 :(得分:3)
如果我们将“一天的秒数”定义为“自午夜以来经过的秒数”,则即使在发生daylight saving time的日子也要获得正确的结果,我们应从给定时间中减去代表午夜的时间。为此,我们可以使用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}}向前调整1个小时的日子。
3 am
这将输出(在Go Playground上尝试):
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))
我们打印2018-03-25 00:00:30 +0100 CET
30
2018-03-25 03:00:30 +0200 CEST
7230
的时间是午夜30秒后的时间,当然是daySeconds
。然后,我们将时间增加2小时(2小时= 2 * 3600秒= 7200),即使时间更改为3小时,这个新时间的30
也将正确地daySeconds
。>
答案 1 :(得分:1)
注意: 此函数返回(0-86399)范围内的一天中的标称秒数。如果您要查找“自午夜以来经过的秒数”,由于夏令时可能不在(0-86399)范围内,请参阅@icza的答案。
更新: 另请注意,该问题涉及Joda Time实施,根据Joda Time getSecondOfDay on DST switch day,该实施似乎与名义上的秒实现数相对应(如我在下面的回答中所示),而不是“自午夜以来经过的秒数” ”(如@icza的回答)。
stack