我创建了一个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:58
,t.end
设置为6:15
,其持续时间为17m
。然而,t.end.Sub(now)
评估为21m
,这是我的笔记本电脑睡着的时间的差异。这里发生了什么?
答案 0 :(得分:3)
这个问题是由于挂钟和单调时钟之间的区别造成的,两者都可能会或可能不会保留在Time
变量中。 Time
变量的不同方法根据单调时钟的存在与否给出不同的结果。我不确定所有的细节,我认为它在Go 1.9中有所改变,但是它记录在时间包的顶部和godoc中。
我认为也可能存在一些差异,具体取决于特定操作系统如何处理单调时钟。我怀疑print语句是打印挂钟值,但Sub
方法使用单调。
尝试在调用now = now.Round(0)
之前使用Sub
从您的某个时间变量中删除单调时钟。这应该通过强制它使用挂钟来解决它。