如何获得一天的秒数

时间:2019-03-06 12:23:48

标签: go time

如何在Go中获取一天中的秒数(1-86400)?

就像http://joda-time.sourceforge.net/apidocs/org/joda/time/base/AbstractDateTime.html#getSecondOfDay()

更新/说明

  • 想要相当于golang中的joda / SecondOfDay
  • 预计从一天开始的0和86400开始
  • 在golang中重写Java开源函数时需要,而Java开源函数又使用joda / secondOfDay
  • Googled“ 24小时到秒”获得86400
  • 虽然我现在只想问一个问题.Unix()-昨天的Midnight.Unix()和简单的公认答案都没有想到
  • 显然没有考虑夏令时
  • 想看看是否有一些内置函数或流行/标准库

2 个答案:

答案 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:002 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