如何获得一天中的秒数

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

更新/澄清

  • 想要相当于 golang 中的 joda/SecondOfDay

  • 预计在一天结束时从 0 和 86400 开始

  • 在 golang 中重写一个 java 开源函数时需要,该函数又使用 joda/secondOfDay

  • 用谷歌搜索“24 小时到秒”得到 86400

  • 在提问时我只能想到 now.Unix()-yesterdayMidnight.Unix() 而我并没有想到简单接受的答案

  • 显然没有考虑夏令时

  • 想看看是否有一些内置函数或流行/标准库


梵蒂冈之花
浏览 218回答 2
2回答

蝴蝶不菲

如果我们将“一天中的秒数”定义为“自午夜以来经过的秒数”,那么即使在夏令时发生的日子里,为了获得正确的结果,我们也应该从给定时间中减去代表午夜的时间。为此,我们可以使用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上尝试):309075043950让我们看看这个函数如何在夏令时发生时给出正确的结果。在匈牙利,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 CET302018-03-25 03:00:30 +0200 CEST7230我们打印daySeconds午夜后 30 秒的时间,这是30当然的。然后我们将时间加上 2 小时(2 小时 = 2*3600 秒 = 7200),这个daySeconds新时间的时间将是正确的7200 + 30 = 7230,即使时间更改为 3 小时。

神不在的星期二

注意: 此函数返回 (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))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go