Lompati ke konten utama
Modul 8 · Pelajaran 4 dari 539/50 dalam kursus~12 min
Pelajaran modul (4/5)

Paket `waktu`

Paket time memodelkan tiga konsep berbeda: instan (time.Time), durasi (time.Duration) dan alat periodik (timer, ticker). Membedakannya sangatlah penting: momen adalah sebuah titik pada garis waktu, durasi adalah interval.

time.Time — instan

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 tidak dapat diubah: semua metode Add, Truncate, Round mengembalikan Time baru.

Untuk membandingkan instans gunakan Before, After, Equal. Jangan gunakan == jika instans dapat memiliki zona waktu/jam monoton yang berbeda.

time.Duration — interval

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

const timeout = 5 * time.Second

time.Duration adalah alias dari int64 yang menghitung nanodetik. Konstanta time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, time.Minute, time.Hour bertipe Duration.

Parsing dan pemformatan: tata letak referensi

Go tidak menggunakan string seperti YYYY-MM-DD. Ini menggunakan referensi kanonik instan:

Code
Mon Jan 2 15:04:05 MST 2006

yaitu 01/02 03:04:05PM '06 -0700. Dengan menghafal tata letak ini (mnemonik: 1-2-3-4-5-6-7) Anda dapat memformat tanggal berapa pun:

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

Stdlib menawarkan tata letak siap pakai: time.RFC3339 ("2006-01-02T15:04:05Z07:00"), time.RFC1123, time.Kitchen ("3:04PM").

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

Mengukur waktu

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

time.Since menggunakan jam monotonik: tidak terganggu oleh penyesuaian jam sistem (NTP, waktu musim panas). Untuk pengukuran kinerja itulah yang Anda inginkan.

Pengatur Waktu dan Ticker

  • time.After(d) mengembalikan chan time.Time yang menerima hanya sekali setelah d. Berguna di select:
Go
select {
case res := <-ch:
    fmt.Println("ok", res)
case <-time.After(2 * time.Second):
    return errors.New("timeout")
}
  • time.NewTimer(d) adalah varian yang dapat dihentikan (t.Stop()).
  • time.NewTicker(d) mengirim berulang kali setiap d. Ingat defer ticker.Stop() untuk menghindari kebocoran goroutine.
Go
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Latihan

Latihan#go.m8.l4.e1
Upaya: 0Memuat…

Cetak instan saat ini dengan format sesuai waktu.RFC3339.

Memuat editor…

Solusi tersedia setelah 3 upaya

Latihan#go.m8.l4.e2
Upaya: 0Memuat…

Ukur berapa lama waktu. Tidur 10 ms menggunakan waktu. Sejak dan cetak hasilnya.

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m8.l4.e3
Siap

Apa jenis konstanta `waktu.Kedua`?

Go
d := time.Second
// d ha tipo ???
Pilihan jawaban