Przejdź do głównej treści
eLearner.app
Moduł 8 · Lekcja 4 z 539/50 w kursie~12 min
Lekcje modułu (4/5)

Pakiet time

Pakiet time modeluje trzy różne koncepcje: czasy (time.Time), czas trwania (time.Duration) i narzędzia okresowe (zegar, ticker). Rozróżnienie ich jest kluczowe: chwila to punkt na osi czasu, czas trwania to interwał.

time.Time — natychmiastowe

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 jest niezmienny: wszystkie metody Add, Truncate, Round zwracają nowy Time.

Aby porównać momenty, użyj Before, After, Equal. Nie używaj ==, jeśli momenty mogą mieć różne strefy czasowe/zegary monotoniczne.

time.Duration — interwały

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

const timeout = 5 * time.Second

time.Duration to alias int64, który liczy nanosekundy. Stałe time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour są typu Duration.

Parsowanie i formatowanie: układ referencyjny

Go nie używa ciągów takich jak YYYY-MM-DD. Używa kanonicznego momentu odniesienia:

Code
Mon Jan 2 15:04:05 MST 2006

tj. 01/02 03:04:05PM '06 -0700. Zapamiętując ten układ (mnemonik: 1-2-3-4-5-6-7) możesz sformatować dowolną 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")

Biblioteka stdlib oferuje gotowe układy: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

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

Czas pomiaru

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

time.Since wykorzystuje zegar monotoniczny: nie jest zakłócany przez regulacje zegara systemowego (NTP, czas letni). Jeśli chodzi o pomiary wydajności, to jest to, czego chcesz.

Timer i Ticker

  • time.After(d) zwraca chan time.Time, który otrzymuje tylko raz po d. Przydatne w select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) jest wariantem możliwym do zatrzymania (t.Stop()).
  • time.NewTicker(d) wysyła wielokrotnie każdy d. Zapamiętaj defer ticker.Stop(), aby uniknąć wycieków goroutiny.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Ćwiczenia

Ćwiczenie#go.m8.l4.e1
Próby: 0Ładowanie...

Wydrukuj bieżący moment w formacie zgodnym z czasem. RFC3339.

Ładowanie edytora...

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m8.l4.e2
Próby: 0Ładowanie...

Zmierz, ile czasu zajmuje czas. Sen wynoszący 10 ms, wykorzystując czas. Od i wydrukuj wynik.

Ładowanie edytora...

Rozwiązanie dostępne po 3 próbach

Quiz#go.m8.l4.e3
Gotowe

Jakiego typu jest stała `time.Second`?

Go
d := time.Second
// d ha tipo ???
Opcje odpowiedzi