// Package clock — единая точка чтения времени. // // Прежде время брали `time.Now()` по месту вызова, и конвенция // [docs/conventions/database.md] числила это долгом: метка времени в локальной // зоне, а хранилище сравнивает времена **строками** побайтово. Долг закрыт // заведением этого пакета; правило держит `forbidigo` в `.golangci.yml` — // `time.Now` вне этого пакета запрещён. // // Метка времени и измерение длительности читаются по-разному, и потому здесь две // функции, а не одна. package clock import "time" // Now — метка времени: UTC, как её пишет и сравнивает хранилище. // // Приведение к UTC снимает монотонные часы, и для метки это верно: её кладут в // колонку и сравнивают с чужими значениями, а не с собственным прошлым // показанием. func Now() time.Time { return time.Now().UTC() } // Start — начало измерения длительности: время **с монотонными часами**. // // Зоны у него нет намеренно: значение не выходит наружу и годится только на // вход `time.Since`. Монотонные часы здесь и нужны — иначе перевод стрелок или // поправка ntp посреди конвертации дала бы отрицательную или скачущую // длительность в журнале и в метрике. func Start() time.Time { return time.Now() }