Ce face time.ParseDuration
time.ParseDuration("1h30m") returnează durata de o oră și jumătate. Textul este o succesiune de numere (pot avea zecimale și semn) urmate de unități: ns, us (sau µs), ms, s, m, h. Exemple valide: "300ms", "2.5s", "1h15m30s", "-90m".
Formatul este exact cel produs de Duration.String(), deci o durată salvată ca text se citește înapoi fără pierderi. Este folosit pentru limite de timp din fișiere de configurare, variabile de mediu și linia de comandă (pachetul flag are flag.Duration, care îl folosește).
Nu există unitate pentru zile: „2d” dă eroare; scrie "48h". Un număr fără unitate este acceptat doar dacă este 0.
Parametri
| Parametru | Descriere |
|---|---|
s |
Textul duratei. |
Ce returnează
Durata și o eroare (unitate necunoscută, lipsă sau text invalid).
Exemple
Exemplul 1: Texte valide și invalide
package main
import (
"fmt"
"time"
)
func main() {
for _, s := range []string{"1h30m", "2.5s", "250ms", "1h15m30.5s", "-90m", "0", "2d", "10", "zece minute"} {
d, err := time.ParseDuration(s)
if err != nil {
fmt.Printf("%-12s eroare: %v\n", s, err)
continue
}
fmt.Printf("%-12s = %-10v = %g secunde\n", s, d, d.Seconds())
}
}
Rezultat
1h30m = 1h30m0s = 5400 secunde
2.5s = 2.5s = 2.5 secunde
250ms = 250ms = 0.25 secunde
1h15m30.5s = 1h15m30.5s = 4530.5 secunde
-90m = -1h30m0s = -5400 secunde
0 = 0s = 0 secunde
2d eroare: time: unknown unit "d" in duration "2d"
10 eroare: time: missing unit in duration "10"
zece minute eroare: time: invalid duration "zece minute"
Exemplul 2: Limită de timp citită din setări
Valorile vin ca text (din fișier sau din variabile de mediu); dacă lipsesc sau sunt greșite, folosim o valoare implicită.
package main
import (
"fmt"
"time"
)
func durataSau(text string, implicit time.Duration) time.Duration {
if text == "" {
return implicit
}
d, err := time.ParseDuration(text)
if err != nil || d <= 0 {
fmt.Printf(" (valoare greșită %q, folosesc %v)\n", text, implicit)
return implicit
}
return d
}
func main() {
setari := map[string]string{"timeout_http": "15s", "sesiune": "8h", "cache": "cinci minute"}
fmt.Println("HTTP: ", durataSau(setari["timeout_http"], 30*time.Second))
fmt.Println("Sesiune:", durataSau(setari["sesiune"], 24*time.Hour))
fmt.Println("Cache: ", durataSau(setari["cache"], 5*time.Minute))
fmt.Println("Retry: ", durataSau(setari["retry"], 2*time.Second))
}
Rezultat
HTTP: 15s
Sesiune: 8h0m0s
(valoare greșită "cinci minute", folosesc 5m0s)
Cache: 5m0s
Retry: 2s
Greșeli frecvente
- Scrii zile (
"7d") sau unități românești ("5min"): ambele dau eroare. Folosește"168h"și"5m". - Citești un număr fără unitate (
"30") crezând că sunt secunde: dă eroare. Fie ceri unitatea în setări, fie convertești tu:time.Duration(n) * time.Second.
Comenzi înrudite
time.Duration: Tipul pentru o durată, păstrată în nanosecunde; se scrie ca 90*time.Minute și se afișează ca „1h30m0s”.time.Parse: Citește o dată din text după un model (2006-01-02 15:04); ParseInLocation o interpretează într-un fus orar dat.time.Duration.Hours: Transformă o durată în număr de ore, minute sau secunde (float64) ori milisecunde (int64).context.WithTimeout: Creează un context care se anulează singur după durata dată; limita de timp standard pentru cereri și interogări.