time.Time.Sub()系统睡眠后计算错误

时间:2018-04-27 09:52:30

标签: go

我创建了一个timer application来在终端窗口中运行。

当我启动终端计时器时,我正在time.Time.Sub()中看到一些奇怪的行为,并通过关闭它让我的macOS笔记本电脑运行它。

当我重新打开笔记本电脑时,突然显示该功能无法正常工作,由this block of code跟踪,除非我误解了time.Time值,否则可以在此复制输出中看到错误计算:< / p>

== 615a Timer ==
20m59s

now: 2018-04-27 05:58:20.440440541 -0700 PDT m=+310.234277006
exactLeft: 20m59.142673336s
t.end: 2018-04-27 06:15:00.000129434 -0700 PDT m=+1569.376950342
t.end.Sub(now): 20m59.142673336s

明确地,now设置为5:58t.end设置为6:15,其持续时间为17m。然而,t.end.Sub(now)评估为21m,这是我的笔记本电脑睡着的时间的差异。这里发生了什么?

1 个答案:

答案 0 :(得分:3)

这个问题是由于挂钟和单调时钟之间的区别造成的,两者都可能会或可能不会保留在Time变量中。 Time变量的不同方法根据单调时钟的存在与否给出不同的结果。我不确定所有的细节,我认为它在Go 1.9中有所改变,但是它记录在时间包的顶部和godoc中。

我认为也可能存在一些差异,具体取决于特定操作系统如何处理单调时钟。我怀疑print语句是打印挂钟值,但Sub方法使用单调。

尝试在调用now = now.Round(0)之前使用Sub从您的某个时间变量中删除单调时钟。这应该通过强制它使用挂钟来解决它。