如何获得一天的几秒钟



如何在GO中获得秒数(1-86400)?

就像http://joda time.sourceforge.net/apidocs/org/joda/joda/time/base/base/abstractdatetime.html#getsececondofday()

更新/澄清

  • 想要等效于Golang的Joda/secondofday
  • 预计将在一天结束时从0和86400开始
  • 在Golang重写Java OpenSource函数时,需要使用Joda/secondofday
  • 谷歌搜索的'24小时到秒'获得86400
  • 在提出问题时,我只能想到现在。unix() - dearthermidnight.unix(),简单接受的答案并没有想到我的想法
  • 显然没有考虑拯救日光
  • 想看看是否有一些内置功能或流行/标准库

如果我们将"一天的秒"定义为"自午夜以来经过的几秒钟",那么即使在日光节省时间发生时间的日子里,我们也应该减去代表午夜的时间给定时间。为此,我们可以使用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操场上尝试):

30
90
750
43950

让我们看看当日光节省时间发生时,该功能如何给出正确的结果。2018年3月25日在匈牙利,是02:00:00上时钟1小时的日子,从2 am3 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*3600秒= 7200)中添加2个小时,即使时间更改了3个小时,新时间的daySeconds即使CC_7也会正确。

注意:此函数返回(0-86399)范围内的名义数秒。如果您正在寻找"自午夜以来经过的秒数",则由于节省日光而可能不在(0-86399)范围内,请参阅 @ICZA的答案。

更新:还请注意,问题是指Joda Time实施,根据Joda Time在DST Switch Day的纪念日,这似乎与标称秒数实现数(如下我的答案)相对应,而不是"经过的秒数自午夜以来"(如 @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))
}

最新更新