Paket time menyediakan tipe waktu, durasi, dan timer bagi program Go. Topik ini membahas tiga hal yang paling sering diperlukan, yaitu menyusun nilai waktu dengan time.Date, memformat dan mengurai waktu menggunakan konsep layout referensi, serta menghitung durasi dengan tipe time.Duration. Semua contoh memakai tanggal tetap sehingga keluarannya dapat direproduksi, karena time.Now() mengembalikan waktu saat ini yang berubah pada setiap eksekusi. Setelah membacanya, catatan waktu dapat dibentuk, ditampilkan dalam berbagai bentuk, dan dihitung selisihnya secara presisi.
Waktu sebagai nilai time.Time#
Tipe time.Time menampung satu momen waktu beserta zona waktunya, sedangkan time.Date menyusun momen tersebut dari komponen tahun, bulan, hari, jam, menit, detik, nanodetik, dan lokasi. Nilai bulannya bertipe time.Month, misalnya time.March, sehingga bulan pada program tidak dinyatakan dengan angka yang mudah tertukar. Komponen nilai waktu dapat dibaca kembali melalui metode Year, Month, Day, Weekday, dan Clock, sedangkan zona waktu dinyatakan dengan time.LoadLocation atau konstanta time.UTC (Coordinated Universal Time, waktu universal terkoordinasi). Contoh berikut menyusun satu momen waktu tetap untuk keperluan catatan arsip.
// tidak-dijalankan
t := time.Date(2026, time.March, 14, 15, 4, 5, 0, time.UTC)
fmt.Println(t.Year(), t.Month(), t.Day(), t.Weekday())Nilai time.Time itu kemudian menjadi bahan untuk format, parse, perbandingan, dan aritmetika durasi. Penyusunan dengan time.Date sengaja dipakai pada seluruh contoh topik ini, karena hasil programnya tidak bergantung pada tanggal ketika program dijalankan. Untuk data nyata, momen waktu biasanya diperoleh dari time.Now(), dari time.Parse, atau dari data yang diterima program, sedangkan sisa pemakaiannya tetap sama. Zona lain dimuat dengan time.LoadLocation, misalnya "Asia/Jakarta", dan pemindahan zona dilakukan dengan metode In tanpa mengubah momen waktunya.
Format dan parse dengan layout referensi#
Format waktu Go berbeda dari bahasa lain karena tidak memakai simbol seperti YYYY atau MM. Go memakai layout referensi, yaitu satu waktu contoh tertentu yang dituliskan dalam bentuk yang diinginkan. Waktu referensinya adalah Mon Jan 2 15:04:05 MST 2006, yang lazim diingat sebagai 01/02 03:04:05PM 06 berurutan dari bulan, tanggal, jam, menit, detik, sampai tahun. Tanda-tanda pada layout itu dipetakan ke nilai time.Time yang diformat, sehingga 02/03/2006 menghasilkan tanggal dengan format hari-bulan-tahun, sedangkan 15:04 menghasilkan jam dan menit. Fungsi Format menerapkan layout pada nilai waktu, sedangkan fungsi Parse melakukan kebalikannya, yaitu mengurai string menjadi time.Time dengan layout yang sama. Program berikut mendemonstrasikan keduanya.
package main
import (
"fmt"
"time"
)
func main() {
t := time.Date(2026, time.March, 14, 15, 4, 5, 0, time.UTC)
fmt.Println("hari:", t.Weekday())
fmt.Println("layout referensi:", t.Format("Mon Jan 2 15:04:05 MST 2006"))
fmt.Println("tanggal ringkas:", t.Format("02/03/2006"))
fmt.Println("jam dan menit:", t.Format("15:04"))
fmt.Println("RFC3339:", t.Format(time.RFC3339))
diparse, err := time.Parse("2006-01-02 15:04", "2026-03-14 09:30")
if err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("hasil parse:", diparse.In(time.UTC).Format("2006-01-02 15:04"))
}hari: Saturday
layout referensi: Sat Mar 14 15:04:05 UTC 2026
tanggal ringkas: 14/03/2026
jam dan menit: 15:04
RFC3339: 2026-03-14T15:04:05Z
hasil parse: 2026-03-14 09:30Baris layout referensi menunjukkan sifat yang menjelaskan asal istilah tersebut. Setiap bagian waktu contoh pada layout ditukar dengan nilai yang sesuai, sehingga keluaran meniru bentuk Mon Jan 2 15:04:05 MST 2006. Konstanta time.RFC3339 adalah layout bawaan pustaka standar untuk format waktu pada protokol internet, sehingga bentuknya seperti 2026-03-14T15:04:05Z. Pada Parse, string masukan diuraikan sesuai layout yang diberikan. Apabila penguraian gagal, error wajib diperiksa sebelum hasilnya dipakai. Hasil Parse tanpa zona pada stringnya berada di UTC, sehingga pemanggilan In(time.UTC) pada contoh hanya menegaskan zona tersebut.
Durasi dan perbandingan waktu#
Tipe time.Duration menyatakan selisih waktu dengan satuan nanodetik, dan konstanta seperti time.Second, time.Minute, dan time.Hour memudahkan penulisan durasi tanpa hitungan manual. Durasi dapat ditambahkan ke time.Time melalui metode Add, sedangkan selisih dua momen waktu dihitung dengan metode Sub yang mengembalikan time.Duration. Untuk perbandingan, metode Before dan After menentukan urutan dua momen waktu. Kombinasi semacam ini dipakai pada penghitungan tenggat, misalnya sesi arsip yang dimulai pukul 08.00 dan harus selesai 30 detik kemudian. Program berikut menghitung durasi sesi dan tenggatnya.
package main
import (
"fmt"
"time"
)
func main() {
mulai := time.Date(2026, time.March, 14, 8, 0, 0, 0, time.UTC)
selesai := mulai.Add(9*time.Hour + 30*time.Minute)
fmt.Println("sesi:", mulai.Format("15:04"), "sampai", selesai.Format("15:04"))
durasi := selesai.Sub(mulai)
fmt.Println("durasi:", durasi)
fmt.Println("menit:", durasi.Minutes())
fmt.Println("jam penuh:", int(durasi.Hours()))
tenggat := mulai.Add(30 * time.Second)
fmt.Println("tenggat:", tenggat.Format("15:04:05"))
fmt.Println("mulai sebelum tenggat:", mulai.Before(tenggat))
fmt.Println("satu jam sama dengan", int(time.Hour/time.Minute), "menit")
}sesi: 08:00 sampai 17:30
durasi: 9h30m0s
menit: 570
jam penuh: 9
tenggat: 08:00:30
mulai sebelum tenggat: true
satu jam sama dengan 60 menitKeluaran 9h30m0s adalah bentuk teks bawaan time.Duration, yang juga dapat dibaca kembali oleh fungsi time.ParseDuration. Metode Minutes dan Hours mengembalikan nilai pecahan bertipe float64, sehingga konversi eksplisit ke int diperlukan bila yang dibutuhkan hanya bagian bulatnya. Baris terakhir memperlihatkan bahwa durasi dapat dibagi satu sama lain, yaitu time.Hour dibagi time.Minute menghasilkan 60. Untuk menunggu sebelum melanjutkan, fungsi time.Sleep dan time.After menerima durasi yang sama dan menjadi dasar timer pada program konkurensi.
Kedua program dapat dijalankan dari terminal sebagaimana berikut.
# siapkan folder kerja untuk topik ini
mkdir -p /tmp/gopustaka/time
cp format-waktu.go durasi-waktu.go /tmp/gopustaka/time/
cd /tmp/gopustaka/time
# jalankan program format dan parse waktu
go run format-waktu.go
# jalankan program durasi
go run durasi-waktu.gohari: Saturday
layout referensi: Sat Mar 14 15:04:05 UTC 2026
tanggal ringkas: 14/03/2026
jam dan menit: 15:04
RFC3339: 2026-03-14T15:04:05Z
hasil parse: 2026-03-14 09:30
sesi: 08:00 sampai 17:30
durasi: 9h30m0s
menit: 570
jam penuh: 9
tenggat: 08:00:30
mulai sebelum tenggat: true
satu jam sama dengan 60 menitKesalahan umum#
- Menuliskan layout dengan gaya bahasa lain, misalnya
"YYYY-MM-DD". Layout tersebut bukan simbol yang dikenali Go, sehingga hasilnya hurufYYYYapa adanya, bukan tahun. Perbaikannya, gunakan bagian dari waktu referensi, yaitu2006-01-02. - Mengabaikan error pada
Parse. String yang tidak cocok dengan layoutnya menghasilkan nilai nol beserta error, sehingga program yang tidak memeriksa error berlanjut dengan waktu nol. Perbaikannya, periksa error sebelum nilai hasilnya dipakai. - Menganggap
Durationbertipe pecahan. Tipe ini berupa bilangan bulat berhitungan nanodetik, sehingga pembagian dua durasi denganint()menghilangkan sisanya. Gunakan metodeMinutesatauHoursbila nilai pecahannya diperlukan. - Menganggap hasil
Formatmengikuti zona komputer. Format mengikuti zona yang tersimpan pada nilainya, sehingga nilai UTC tetap dicetak dalam UTC meskipun komputernya berada di zona lain. Perbaikannya, panggilInuntuk memindahkan zona sebelum diformat. - Membandingkan waktu dari zona berbeda dengan
==. Operator==juga membandingkan informasi zona waktunya, sehingga dua momen yang sama dapat dinilai berbeda. Gunakan metodeEqualuntuk membandingkan momennya saja.
Ringkasan#
time.Datemenyusun nilaitime.Timedari komponen tahun sampai nanodetik beserta lokasi waktunya, sedangkantime.Now()mengambil momen saat ini.- Format dan parse Go memakai layout referensi
Mon Jan 2 15:04:05 MST 2006, yaitu waktu contoh yang dipetakan ke bentuk yang diinginkan. time.Durationmenyatakan selisih waktu dalam nanodetik dan dipakai bersamaAdd,Sub,Before, danAfter.time.RFC3339dan konstanta layout lain bawaan pustaka standar menyediakan format yang lazim untuk pertukaran data.
Referensi#
- Package time — The Go Authors — Dokumentasi resmi tipe Time, Duration, konstanta layout, dan fungsi Parse.
- The Go Documentation — Halaman induk dokumentasi resmi Go yang memuat panduan pustaka standar.