Ce face time.Duration
time.Duration este un int64 care numără nanosecunde. Nu scrii numere de nanosecunde de mână: înmulțești constantele pachetului, de exemplu 2 * time.Hour, 500 * time.Millisecond, time.Hour + 30*time.Minute. Duratele se pot aduna, scădea, compara și împărți între ele.
d.String() (apelat automat de fmt) dă o formă ușor de citit: 1h30m0s, 1.5s, 250ms. Operația inversă este time.ParseDuration("1h30m"), utilă pentru setări citite din fișiere sau din linia de comandă.
Funcțiile care așteaptă, cum sunt time.Sleep, time.After sau context.WithTimeout, primesc toate un time.Duration.
Ce returnează
String(): textul duratei. ParseDuration: durata și o eroare dacă textul nu e valid.
Exemple
Exemplul 1: Construirea și afișarea duratelor
package main
import (
"fmt"
"time"
)
func main() {
film := 2*time.Hour + 15*time.Minute
pauza := 20 * time.Minute
fmt.Println("Film:", film)
fmt.Println("Cu pauză:", film+pauza)
fmt.Println("Mai lung de 2h:", film > 2*time.Hour)
fmt.Println("Jumătate:", film/2)
fmt.Println("Câte pauze încap:", int(film/pauza)) // durată / durată = număr
fmt.Println(1500*time.Millisecond, 250*time.Millisecond, 3*time.Microsecond)
fmt.Println("În nanosecunde:", int64(time.Second))
}
Rezultat
Film: 2h15m0s
Cu pauză: 2h35m0s
Mai lung de 2h: true
Jumătate: 1h7m30s
Câte pauze încap: 6
1.5s 250ms 3µs
În nanosecunde: 1000000000
Exemplul 2: Din variabilă int și din text
O variabilă int trebuie convertită la time.Duration înainte de înmulțire. ParseDuration acceptă unitățile h, m, s, ms, us, ns.
package main
import (
"fmt"
"time"
)
func main() {
minute := 45
d := time.Duration(minute) * time.Minute
fmt.Println("Ședința:", d)
for _, text := range []string{"1h30m", "2.5s", "300ms", "90m", "zece"} {
durata, err := time.ParseDuration(text)
if err != nil {
fmt.Println("eroare:", err)
continue
}
fmt.Printf("%-6s -> %v\n", text, durata)
}
}
Rezultat
Ședința: 45m0s
1h30m -> 1h30m0s
2.5s -> 2.5s
300ms -> 300ms
90m -> 1h30m0s
eroare: time: invalid duration "zece"
Greșeli frecvente
- Dai un număr simplu unde se așteaptă durată:
time.Sleep(2)așteaptă 2 nanosecunde, nu 2 secunde. Scrie2 * time.Second. - Înmulțești două durate:
time.Second * time.Secondnu are sens și dă un număr uriaș. Doar una dintre valori trebuie să fie durată. - Pui
time.Durationîn JSON și te aștepți la „1h30m”. Se salvează numărul de nanosecunde (5400000000000); salveazăd.String()dacă vrei text.
Comenzi înrudite
time.ParseDuration: Citește o durată scrisă ca text („1h30m”, „250ms”, „2.5s”) într-un time.Duration; util pentru setări.time.Duration.Hours: Transformă o durată în număr de ore, minute sau secunde (float64) ori milisecunde (int64).time.Duration.Round: Rotunjește o durată la un multiplu: Round la cel mai apropiat, Truncate în jos (ex. la secundă pentru afișare).time.Time.Add: Returnează momentul mutat înainte (sau înapoi, cu durată negativă) cu o durată exactă: ore, minute, secunde.time.Time.Sub: Calculează cât timp a trecut între două momente și returnează diferența ca time.Duration.time.Sleep: Oprește goroutine-ul curent pentru durata dată (de exemplu 500*time.Millisecond), apoi continuă.