В Go есть два вида часов: wall clock (реальное время) и monotonic clock (монотонные часы). Wall clock может прыгать — при синхронизации через NTP, переводе часов, смене timezone. Monotonic clock только растёт и никогда не прыгает назад.
time.Now() возвращает оба значения сразу. Когда ты вычисляешь разницу через time.Since(start) или end.Sub(start), Go автоматически использует monotonic компонент. Поэтому измерение длительности всегда точное, даже если NTP подкрутил часы посередине.
start := time.Now() // содержит и wall, и monotonic
time.Sleep(time.Second)
fmt.Println(time.Since(start)) // использует monotonic — точно ~1s
А вот форматирование, сравнение с конкретной датой и маршалинг используют wall clock. Если нужно убрать monotonic компонент — вызови t.Round(0). Эта дуальность появилась в Go 1.9 и решила кучу багов с таймаутами и метриками.