просчет time.Time.Sub () после системного сна - PullRequest
0 голосов
/ 27 апреля 2018

Я создал приложение таймера для запуска в окне терминала.

Я наблюдаю какое-то странное поведение в time.Time.Sub(), когда я запускаю терминальный таймер и переводю свой macOS-ноутбук в спящий режим, закрывая его.

Когда я снова открываю ноутбук, внезапно появляется функция, которая не работает должным образом, что отслеживается этим блоком кода , который можно увидеть в этом скопированном выводе, чтобы он просчитался, если только я не неправильно понял time.Time значения:

== 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, что является разницей во времени, когда мой ноутбук спал. Что здесь происходит?

1 Ответ

0 голосов
/ 27 апреля 2018

Проблема вызвана, я полагаю, различием между настенными часами и монотонными часами, которые могут или не могут содержаться в переменных Time. Различные методы для переменных Time дают разные результаты в зависимости от наличия или отсутствия монотонных часов. Я не уверен во всех плюсах и минусах, и это изменилось в Go 1.9, я думаю, но это задокументировано в верхней части пакета времени и в годоке.

Я думаю, что также могут быть некоторые различия в зависимости от того, как конкретная ОС обрабатывает монотонные часы. Я подозреваю, что оператор print печатает значения настенных часов, но метод Sub использует монотонный режим.

Попробуйте убрать монотонные часы из одной из ваших переменных времени, используя now = now.Round(0) перед вызовом Sub. Это должно исправить это, заставив использовать настенные часы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...