【发布时间】:2020-02-26 12:57:26
【问题描述】:
我正在尝试编写一段代码,该代码将对由于同步引起的系统时间变化做出反应。这是一个在 goroutine 内部运行的相当简单的代码:
var start, end time.Time
var start_ts, end_ts int64
var diff_ts time.Duration
var diff time.Duration
for {
start = time.Now()
start_ts = start.Unix()
fmt.Printf("Now: => %v (%d);\n", start, start_ts)
time.Sleep(1 * time.Second)
end = time.Now()
end_ts = end.Unix()
fmt.Printf("New Now: %v (%d);\n", end, end_ts)
diff = end.Sub(start)
diff_ts = time.Duration(end_ts-start_ts) * time.Second
fmt.Printf("Measured time duration: %v (%v) %f (%f)\n", diff, diff_ts, diff.Seconds(), diff_ts.Seconds())
}
我的问题是,当我在另一个控制台中更改系统时间时,时间读取正确,但是“原始”时差不正确,我不得不求助于手动构建时差。以下是日志的摘录:
Now: => 2020-02-26 12:29:42.778827718 +0000 UTC m=+21.776791756 (1582720182);
New Now: 2017-01-01 01:02:03.391215325 +0000 UTC m=+22.777003266 (1483232523);
Measured time duration: 1.00021151s (-27635h27m39s) 1.000212 (-99487659.000000)
为什么差异对象返回 1 秒,即使差异明显大于那?
【问题讨论】:
-
您的预期行为被视为错误,Go fixed it in 1.9 响应this problem。
-
请注意,您可以从时间值中去除单调时钟读数。可以减去 缺少 个单调时钟的两倍,得到钟面值差异,而不是单调时钟差异:因为 t.AddDate(y, m, d), t .Round(d) 和 t.Truncate(d) 是墙上时间计算,它们总是从结果中去除任何单调时钟读数。(时间包文档)
标签: go time difference