蝴蝶不菲
如果我们将“一天中的秒数”定义为“自午夜以来经过的秒数”,那么即使在夏令时发生的日子里,为了获得正确的结果,我们也应该从给定时间中减去代表午夜的时间。为此,我们可以使用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 小时。