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

Go 系统睡眠后time.time.Sub()计算错误,go,Go,我创建了一个要在终端窗口中运行的 当我启动一个终端计时器并关闭macOS笔记本电脑使其进入睡眠状态时,我看到了一些奇怪的行为 当我重新打开笔记本电脑时,突然该功能似乎无法正常工作,如所跟踪的,这可以从复制的输出中看出,除非我误解了时间。时间值: == 615a Timer == 20m59s now: 2018-04-27 05:58:20.440440541 -0700 PDT m=+310.234277006 exactLeft: 20m59.142673336s t.end: 2018-

我创建了一个要在终端窗口中运行的

当我启动一个终端计时器并关闭macOS笔记本电脑使其进入睡眠状态时,我看到了一些奇怪的行为

当我重新打开笔记本电脑时,突然该功能似乎无法正常工作,如所跟踪的,这可以从复制的输出中看出,除非我误解了
时间。时间值:

== 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(现在)
的计算结果是
21m
,这与我的笔记本电脑睡觉的时间差不多。这里发生了什么?

我认为这个问题是由挂钟和单调时钟之间的差异引起的,这两者可能存在于时间变量中,也可能不存在于时间变量中。根据单调时钟的存在与否,对
时间
变量的不同方法给出不同的结果。我不确定所有的细节,我认为它在Go 1.9中有所改变,但它被记录在时间包的顶部和godoc中

我认为,根据具体操作系统处理单调时钟的方式,也可能存在一些差异。我怀疑print语句正在打印挂钟值,但是
Sub
方法使用的是单调的


在调用
Sub
之前,尝试使用
now=now.Round(0)
从一个时间变量中剥离单调时钟。这应该通过强制使用挂钟来解决。

屏幕截图看起来像是在右手边裁剪的。还有什么操作系统?你认为不同的语言有相同的问题吗。“我从休眠状态出来后,在Windows上遇到了奇怪的时间问题。”StevieB说得很好。我已经更新了问题,以获得更清晰的输出,并指定了我的操作系统。我在用macOS。多么吸引人的问题啊。就这样。感谢您提示阅读《时代》杂志的顶部。它回答了这个问题以及
time.time.String()
中的
m=
符号的含义。