Cap waktu, durasi, jeda, penjadwalan berkala — hampir semua program bertemu masalah waktu. Package time menyediakan tipe time.Time untuk satuan waktu, time.Duration untuk jarak antarwaktu, serta Timer dan Ticker untuk penjadwalan berbasis channel. Chapter ini memakai waktu beku (time.Date) agar setiap contoh menghasilkan output yang persis sama di setiap eksekusi.
Waktu Beku dengan time.Date #
Fungsi time.Now() membaca jam mesin — tepat untuk program nyata, tetapi hasilnya berubah tiap detik sehingga tidak cocok untuk contoh pembelajaran. Fungsi time.Date menyusun waktu secara eksplisit dari tahun sampai nanodetik beserta zonanya; seluruh demo di chapter ini memakai satu waktu beku:
mulai := time.Date(2026, 1, 15, 8, 0, 0, 0, time.UTC)Konstanta time.UTC menandai zona nol — pilihan teraman untuk data yang disimpan; method String() mencetak format bawaan 2026-01-15 08:00:00 +0000 UTC.
Layout Referensi 2006-01-02 15:04 #
Format tidak memakai kode seperti YYYY-MM-DD. Sebagai gantinya, Anda menulis contoh waktu acuan dan Format mengganti setiap komponennya dengan nilai waktu Anda. Acuannya tetap: 2 Januari 2006, pukul 15:04:05 MST. Angkanya sengaja berurutan — bulan 1, tanggal 2, jam 3, menit 4, detik 5, tahun 06, offset zona 7.
| Komponen | Penanda layout | Hasil untuk waktu beku |
|---|---|---|
| Tahun | 2006 atau 06 | 2026 atau 26 |
| Bulan | 01, Jan, January | 01, Jan, January |
| Tanggal | 02 atau 2 | 15 |
| Hari dalam minggu | Monday atau Mon | Thursday atau Thu |
| Jam 24 jam | 15 | 08 |
| Menit dan detik | 04, 05 | 00, 00 |
| Zona | MST, -0700 | UTC, +0000 |
Layout "Monday, 02 Jan 2006" terbaca sebagai: hari lengkap, tanggal, nama bulan singkat, lalu tahun. Konstanta siap pakai juga tersedia, contohnya time.RFC3339.
Parse: dari Teks menjadi Waktu #
time.Parse memakai layout yang sama untuk arah sebaliknya: teks dibaca menurut pola, lalu komponennya mengisi time.Time baru. Pemanggilan time.Parse("2006-01-02", "2026-03-20") menghasilkan waktu 20 Maret 2026; teks yang tidak sesuai pola mengembalikan error yang menjelaskan letaknya.
Duration dan Aritmetika Waktu #
time.Duration adalah tipe jarak waktu berbasis nanodetik dengan konstanta satuan yang terbaca seperti kalimat: time.Hour, time.Minute, time.Second, time.Millisecond. Nilainya bisa dijumlah dan dikurang; method String() menghasilkan teks ringkas seperti 1h45m0s, method Minutes() dan Seconds() mengubahnya ke bilangan.
Aritmetika waktu memakai durasi: Add menggeser time.Time, Sub menghitung selisih dua waktu. Untuk mengukur lamanya proses, idiom umumnya:
durasi := time.Since(awal) // setara dengan time.Now().Sub(awal)time.Since membaca jam nyata, sehingga contoh beku di bawah memakai Sub antar dua waktu tetap.
Zona Waktu: UTC dan WIB #
Method In mengonversi waktu ke zona lain: time.UTC, hasil time.LoadLocation("Asia/Jakarta") yang membaca database zona sistem, atau time.FixedZone("WIB", 7*3600) yang mendefinisikan zona +7 jam secara mandiri. Demo ini memakai FixedZone agar tidak bergantung data zona di mesin; WIB memang setara offset +0700.
Timer, Ticker, dan Sleep #
time.NewTimer(d) membuat pewaktu sekali jalan: setelah durasi terlewati, channel timer.C menerima satu nilai dan baris <-timer.C berhenti menunggu. time.NewTicker(d) berdetak berkala — detikannya mengirim nilai ke ticker.C — dan wajib dihentikan dengan Stop(). time.Sleep(d) paling sederhana: menjeda goroutine selama d.
Program Utuh #
Berkas time-demo.go merangkai seluruh materi:
package main
import (
"fmt"
"time"
)
func main() {
// Waktu beku: nilainya tetap di setiap eksekusi, bukan jam sungguhan.
mulai := time.Date(2026, 1, 15, 8, 0, 0, 0, time.UTC)
fmt.Println("default :", mulai)
fmt.Println("rfc3339 :", mulai.Format(time.RFC3339))
fmt.Println("tanggal :", mulai.Format("02 January 2006"))
fmt.Println("jam :", mulai.Format("15:04"))
fmt.Println("lengkap :", mulai.Format("Monday, 02 Jan 2006"))
// Parse mengubah teks menjadi time.Time memakai layout yang sama.
akhir, err := time.Parse("2006-01-02", "2026-03-20")
if err != nil {
fmt.Println("parse gagal:", err)
return
}
fmt.Println("parsed :", akhir.Format("02/01/2006"))
// Duration: konstanta satuan dan aritmetika antar durasi.
sesi := 90*time.Minute + 15*time.Minute
fmt.Println("durasi :", sesi)
fmt.Printf("menit : %g\n", sesi.Minutes())
// Add dan Sub menghitung waktu baru dari durasi.
selesai := mulai.Add(sesi)
fmt.Println("selesai :", selesai.Format("15:04"))
fmt.Println("selisih :", selesai.Sub(mulai))
// FixedZone membuat zona waktu tetap tanpa membaca database zona.
wib := time.FixedZone("WIB", 7*3600)
fmt.Println("wib :", selesai.In(wib).Format("15:04 MST"))
// Timer mengirim satu sinyal ke channel setelah durasi terlewati.
timer := time.NewTimer(10 * time.Millisecond)
<-timer.C
fmt.Println("timer : selesai")
// Ticker berdetak berkala dan dihentikan dengan Stop.
ticker := time.NewTicker(5 * time.Millisecond)
jumlahTick := 0
for range 3 {
<-ticker.C
jumlahTick++
}
ticker.Stop()
fmt.Println("ticker :", jumlahTick, "tick")
// Sleep menjeda goroutine saat ini selama durasi tertentu.
time.Sleep(2 * time.Millisecond)
fmt.Println("sleep : bangun")
}Jalankan program dari folder chapter:
go run time-demo.goOutput yang Dihasilkan:
default : 2026-01-15 08:00:00 +0000 UTC
rfc3339 : 2026-01-15T08:00:00Z
tanggal : 15 January 2026
jam : 08:00
lengkap : Thursday, 15 Jan 2026
parsed : 20/03/2026
durasi : 1h45m0s
menit : 105
selesai : 09:45
selisih : 1h45m0s
wib : 16:45 WIB
timer : selesai
ticker : 3 tick
sleep : bangunMari kita telaah baris demi baris program di atas:
- Baris 10:
time.Datemembuat waktu beku 15 Januari 2026 pukul 08:00 UTC — dasar seluruh perhitungan. - Baris 11-15: format bawaan
String(), konstantatime.RFC3339, dan tiga layout kustom dicetak berdampingan. - Baris 18-23:
Parsemembaca"2026-03-20"menurut layout"2006-01-02", lalu hasilnya diformat ulang menjadi20/03/2026. - Baris 26-28: dua durasi dijumlah menjadi 105 menit;
String()mencetak1h45m0sdanMinutes()mencetak105. - Baris 31-33:
Addmenggeser jam 08:00 sejauh sesi menjadi 09:45,Submengembalikan selisihnya sebagaiDuration. - Baris 36-37:
FixedZone("WIB", 7*3600)membuat zona +7,Inmengonversi 09:45 UTC menjadi 16:45 WIB. - Baris 40-42:
<-timer.Cmenunggu satu-satunya sinyal timer, lalu pesan selesai dicetak. - Baris 45-52: loop
for range 3menerima tepat tiga detikan ticker,Stopmenghentikannya, lalu jumlah tick dicetak. - Baris 55-56:
Sleepmenjeda goroutine 2 milidetik sebelum baris terakhir dicetak.
Referensi #
- Dokumentasi package time — Time, Duration, layout, dan zona.
- time.Duration — konstanta satuan dan method konversi.
- time.Timer — pewaktu sekali jalan berbasis channel.
- time.Ticker — pewaktu berkala dan kewajiban Stop.
Enam package inti standard library — fmt, os, io, bufio, filepath, time — kini ada di tangan Anda. Sisa section ini menambahkan alat lain, dari logging terstruktur sampai penyematan berkas, yang berdiri di atas fondasi yang baru Anda kuasai.
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
time-demo.go
Unduh berkaspackage main
import (
"fmt"
"time"
)
func main() {
// Waktu beku: nilainya tetap di setiap eksekusi, bukan jam sungguhan.
mulai := time.Date(2026, 1, 15, 8, 0, 0, 0, time.UTC)
fmt.Println("default :", mulai)
fmt.Println("rfc3339 :", mulai.Format(time.RFC3339))
fmt.Println("tanggal :", mulai.Format("02 January 2006"))
fmt.Println("jam :", mulai.Format("15:04"))
fmt.Println("lengkap :", mulai.Format("Monday, 02 Jan 2006"))
// Parse mengubah teks menjadi time.Time memakai layout yang sama.
akhir, err := time.Parse("2006-01-02", "2026-03-20")
if err != nil {
fmt.Println("parse gagal:", err)
return
}
fmt.Println("parsed :", akhir.Format("02/01/2006"))
// Duration: konstanta satuan dan aritmetika antar durasi.
sesi := 90*time.Minute + 15*time.Minute
fmt.Println("durasi :", sesi)
fmt.Printf("menit : %g\n", sesi.Minutes())
// Add dan Sub menghitung waktu baru dari durasi.
selesai := mulai.Add(sesi)
fmt.Println("selesai :", selesai.Format("15:04"))
fmt.Println("selisih :", selesai.Sub(mulai))
// FixedZone membuat zona waktu tetap tanpa membaca database zona.
wib := time.FixedZone("WIB", 7*3600)
fmt.Println("wib :", selesai.In(wib).Format("15:04 MST"))
// Timer mengirim satu sinyal ke channel setelah durasi terlewati.
timer := time.NewTimer(10 * time.Millisecond)
<-timer.C
fmt.Println("timer : selesai")
// Ticker berdetak berkala dan dihentikan dengan Stop.
ticker := time.NewTicker(5 * time.Millisecond)
jumlahTick := 0
for range 3 {
<-ticker.C
jumlahTick++
}
ticker.Stop()
fmt.Println("ticker :", jumlahTick, "tick")
// Sleep menjeda goroutine saat ini selama durasi tertentu.
time.Sleep(2 * time.Millisecond)
fmt.Println("sleep : bangun")
}