time.Time.Sub în Go

Calculează cât timp a trecut între două momente și returnează diferența ca time.Duration.

Sintaxă
func (t Time) Sub(u Time) Duration

Ce face time.Time.Sub

t.Sub(u) returnează t - u, adică durata de la u până la t. Dacă t este înainte de u, rezultatul este negativ.

Rezultatul este un time.Duration, pe care îl poți afișa direct (2h30m0s) sau îl poți transforma în ore, minute sau secunde cu Hours(), Minutes(), Seconds().

Pentru „cât a trecut de atunci până acum” există scurtătura time.Since(t), echivalentă cu time.Now().Sub(t), iar pentru „cât mai e până atunci” time.Until(t).

Parametri

Parametru Descriere
u Momentul scăzut din t.

Ce returnează

Un time.Duration. Dacă diferența depășește aproximativ 292 de ani, rezultatul este limitat la valoarea maximă (sau minimă).

Exemple

Exemplul 1: Durata unei ture și zilele până la un termen

package main

import (
	"fmt"
	"time"
)

func main() {
	intrare := time.Date(2026, time.October, 19, 8, 45, 0, 0, time.UTC)
	iesire := time.Date(2026, time.October, 19, 17, 15, 0, 0, time.UTC)
	tura := iesire.Sub(intrare)
	fmt.Println("Tura a durat:", tura)
	fmt.Printf("Adică %.1f ore\n", tura.Hours())

	azi := time.Date(2026, time.October, 19, 0, 0, 0, 0, time.UTC)
	craciun := time.Date(2026, time.December, 25, 0, 0, 0, 0, time.UTC)
	zile := int(craciun.Sub(azi).Hours() / 24)
	fmt.Println("Zile până la Crăciun:", zile)

	fmt.Println("Invers (negativ):", azi.Sub(craciun))
}

Rezultat

Tura a durat: 8h30m0s
Adică 8.5 ore
Zile până la Crăciun: 67
Invers (negativ): -1608h0m0s

Exemplul 2: Cât a durat o operație (time.Since)

Măsurarea depinde de calculator, deci rezultatul diferă la fiecare rulare.

package main

import (
	"fmt"
	"time"
)

func main() {
	start := time.Now()
	suma := 0
	for i := range 50_000_000 {
		suma += i
	}
	fmt.Println("Suma:", suma)
	fmt.Println("Durată:", time.Since(start))
}

Rezultat posibil (diferă la fiecare rulare)

Suma: 1249999975000000
Durată: 14.218375ms

Greșeli frecvente

  • Scazi momente cu -: iesire - intrare nu compilează. Folosește iesire.Sub(intrare).
  • Calculezi zilele cu Hours()/24 între date din fusuri cu oră de vară: o zi poate avea 23 sau 25 de ore. Pentru zile de calendar, lucrează în UTC sau compară datele (Date()).

Comenzi înrudite

  • time.Time.Add: Returnează momentul mutat înainte (sau înapoi, cu durată negativă) cu o durată exactă: ore, minute, secunde.
  • time.Since: Since: cât timp a trecut de la t până acum; Until: cât timp mai este până la t. Ambele returnează time.Duration.
  • time.Duration: Tipul pentru o durată, păstrată în nanosecunde; se scrie ca 90*time.Minute și se afișează ca „1h30m0s”.
  • time.Duration.Hours: Transformă o durată în număr de ore, minute sau secunde (float64) ori milisecunde (int64).
  • time.Time.Before: Before, After și Equal compară două momente: este t înainte, după sau exact în același moment cu u?