Direct naar de hoofdinhoud
Module 8 · Les 4 van 539/50 in de cursus~12 min
Modulelessen (4/5)

Het 'tijd'-pakket

Het pakket time modelleert drie verschillende concepten: instants (time.Time), duur (time.Duration) en periodieke tools (timer, ticker). Het is cruciaal om ze te onderscheiden: een moment is een punt op de tijdlijn, een duur is een interval.

time.Time — ogenblikken

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 is onveranderlijk: alle methoden Add, Truncate, Round retourneren een nieuwe Time.

Gebruik Before, After, Equal om instants te vergelijken. Gebruik == niet als de instants verschillende tijdzones/monotone klokken kunnen hebben.

time.Duration — intervallen

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

const timeout = 5 * time.Second

time.Duration is een alias van int64 die nanoseconden telt. De constanten time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour zijn van het type Duration.

Parseren en opmaken: de referentie-indeling

Go gebruikt geen tekenreeksen zoals YYYY-MM-DD. Het gebruikt een canoniek referentiemoment:

Code
Mon Jan 2 15:04:05 MST 2006

d.w.z. 01/02 03:04:05PM '06 -0700. Door deze lay-out (ezelsbruggetje: 1-2-3-4-5-6-7) te onthouden, kunt u elke datum opmaken:

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")

De stdlib biedt kant-en-klare lay-outs: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

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

Tijd meten

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

time.Since gebruikt de monotone klok: deze wordt niet verstoord door aanpassingen van de systeemklok (NTP, zomertijd). Voor prestatiemetingen is dat wat je wilt.

Timer en ticker

  • time.After(d) retourneert een chan time.Time die slechts één keer ontvangt na d. Handig in select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) is een stopbare variant (t.Stop()).
  • time.NewTicker(d) verzendt herhaaldelijk elke d. Onthoud defer ticker.Stop() om goroutinelekken te voorkomen.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Oefeningen

Oefening#go.m8.l4.e1
Pogingen: 0Laden…

Druk het huidige instant af, opgemaakt volgens tijd.RFC3339.

Editor laden…

Oplossing beschikbaar na 3 pogingen

Oefening#go.m8.l4.e2
Pogingen: 0Laden…

Meet hoe lang een tijd duurt. Een slaap van 10 ms duurt met behulp van de tijd. Sindsdien en print het resultaat.

Editor laden…

Oplossing beschikbaar na 3 pogingen

Quiz#go.m8.l4.e3
Klaar

Welk type is de constante `time.Second`?

Go
d := time.Second
// d ha tipo ???
Antwoordmogelijkheden