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
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
d := 250 * time.Millisecond
fmt.Println(d) // 250ms
fmt.Println(d.Seconds()) // 0.25 (float64)
const timeout = 5 * time.Secondtime.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:
Mon Jan 2 15:04:05 MST 2006d.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:
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").
fmt.Println(time.Now().Format(time.RFC3339))Tijd meten
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 eenchan time.Timedie slechts één keer ontvangt nad. Handig inselect:
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 elked. Onthouddefer ticker.Stop()om goroutinelekken te voorkomen.
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
fmt.Println("tick")
}Oefeningen
Druk het huidige instant af, opgemaakt volgens tijd.RFC3339.
Oplossing beschikbaar na 3 pogingen
Meet hoe lang een tijd duurt. Een slaap van 10 ms duurt met behulp van de tijd. Sindsdien en print het resultaat.
Oplossing beschikbaar na 3 pogingen
Welk type is de constante `time.Second`?
d := time.Second
// d ha tipo ???