time.ParseDuration în Go

Citește o durată scrisă ca text („1h30m”, „250ms”, „2.5s”) într-un time.Duration; util pentru setări.

Sintaxă
func ParseDuration(s string) (Duration, error)

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.