Salt la conținutul principal
Modulul 8 · Lecția 4 din 539/50 în curs~12 min
Lecții din modul (4/5)

Pachetul `timp`

Pachetul time modelează trei concepte distincte: instantanee (time.Time), durate (time.Duration) și instrumente periodice (cronometru, ticker). Distingerea lor este crucială: o clipă este un punct pe linia temporală, o durată este un interval.

time.Time — instante

Go
now := time.Now()                // current instant in the local timezone
utc := now.UTC()                 // same instant in UTC
later := now.Add(2 * time.Hour)  // add a duration
diff := later.Sub(now)           // 2h0m0s (it's a Duration)

fmt.Println(now.Year(), now.Month(), now.Day())
fmt.Println(now.Weekday())

time.Time este imuabil: toate metodele Add, Truncate, Round returnează un nou Time.

Pentru a compara instantele utilizați Before, After, Equal. Nu folosiți == dacă momentele pot avea fusuri orare diferite/ceasuri monotone.

time.Duration — intervale

Go
d := 250 * time.Millisecond
fmt.Println(d)         // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)

const timeout = 5 * time.Second

time.Duration este un alias al lui int64 care numără nanosecunde. Constantele time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, PROTECTEDINLINE sunt de tipul time.Hour_PROTECTED_21___

Analizare și formatare: aspectul de referință

Go nu folosește șiruri precum YYYY-MM-DD. Folosește un instant de referință canonic:

Code
Mon Jan 2 15:04:05 MST 2006

adică 01/02 03:04:05PM '06 -0700. Prin memorarea acestui aspect (mnemonic: 1-2-3-4-5-6-7) puteți formata orice dată:

Go
const layout = "2006-01-02 15:04:05"
s := time.Now().Format(layout)            // "2026-05-16 14:30:00"
t, err := time.Parse(layout, "2026-05-16 14:30:00")

Stdlib oferă aspecte gata făcute: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

Go
fmt.Println(time.Now().Format(time.RFC3339))

Măsurarea timpului

Go
start := time.Now()
work()
elapsed := time.Since(start)  // = time.Now().Sub(start)
fmt.Println("ci ha messo", elapsed)

time.Since folosește ceasul monoton: nu este perturbat de ajustările ceasului sistemului (NTP, ora de vară). Pentru măsurarea performanței, asta este ceea ce doriți.

Timer și Ticker

  • time.After(d) returnează un chan time.Time care primește o singură dată după d. Util în select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) este o variantă care poate fi oprită (t.Stop()).
  • time.NewTicker(d) trimite în mod repetat fiecare d. Nu uitați defer ticker.Stop() pentru a evita scurgerile goroutine.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Exerciții

Exercițiu#go.m8.l4.e1
Încercări: 0Se încarcă…

Imprimați instantul curent formatat în funcție de timp.RFC3339.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Exercițiu#go.m8.l4.e2
Încercări: 0Se încarcă…

Măsurați cât timp. Somnul de 10 ms durează folosind timpul. Din moment ce și imprimați rezultatul.

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m8.l4.e3
Gata

Ce tip este constanta `time.Second`?

Go
d := time.Second
// d ha tipo ???
Opțiuni de răspuns