Penanganan waktu cukup kompleks. Asumsi umum yang salah tentang waktu termasuk hal berikut.
- Sehari terdiri dari 24 jam.
- Sejam terdiri dari 60 menit.
- Seminggu terdiri dari tujuh hari.
- Setahun terdiri dari 365 hari.
Sebagai contoh, 1 menunjukkan bahwa menambahkan 24 jam ke titik waktu tertentu tidak selalu menghasilkan hari kalender baru.
Oleh karena itu, saat menangani waktu, selalu gunakan paket "time"
karena ini membantu menangani asumsi yang salah ini dengan cara yang lebih aman dan akurat.
Menggunakan time.Time
untuk Mewakili Waktu Instan
Saat menangani waktu instan, gunakan time.Time
dan metodenya untuk membandingkan, menambahkan, atau mengurangi waktu.
Tidak Disarankan:
func isActive(now, start, stop int) bool {
return start <= now && now < stop
}
Disarankan:
func isActive(now, start, stop time.Time) bool {
return (start.Before(now) || start.Equal(now)) && now.Before(stop)
}
Menggunakan time.Duration
untuk Mewakili Durasi Waktu
Saat menangani durasi waktu, gunakan time.Duration
.
Tidak Disarankan:
func poll(delay int) {
for {
// ...
time.Sleep(time.Duration(delay) * time.Millisecond)
}
}
poll(10) // Apakah dalam detik atau milidetik?
Disarankan:
func poll(delay time.Duration) {
for {
// ...
time.Sleep(delay)
}
}
poll(10*time.Second)
Kembali ke contoh pertama, saat menambahkan 24 jam ke waktu instan, metode yang digunakan bergantung pada niat. Jika kita ingin titik waktu yang sama pada hari kalender berikutnya (hari setelah hari saat ini), kita harus menggunakan Time.AddDate
. Namun, jika kita ingin memastikan bahwa suatu saat tertentu adalah 24 jam setelah saat sebelumnya, kita harus menggunakan Time.Add
.
newDay := t.AddDate(0 /* tahun */, 0 /* bulan */, 1 /* hari */)
maybeNewDay := t.Add(24 * time.Hour)
Menggunakan time.Time
dan time.Duration
dengan Sistem Eksternal
Kapan pun memungkinkan, gunakan time.Duration
dan time.Time
dalam interaksi dengan sistem eksternal, misalnya:
- Command-line flags:
flag
mendukungtime.Duration
melaluitime.ParseDuration
. - JSON:
encoding/json
mendukung pengkodeantime.Time
ke string RFC 3339 menggunakanmetode UnmarshalJSON
. - SQL:
database/sql
mendukung mengonversi kolomDATETIME
atauTIMESTAMP
ketime.Time
, dan mengembalikannya jika driver di bawahnya mendukungnya. - YAML:
gopkg.in/yaml.v2
mendukung penggunaantime.Time
sebagai string RFC 3339 dantime.Duration
melaluitime.ParseDuration
.
Ketika time.Duration
tidak dapat digunakan dalam interaksi ini, gunakan int
atau float64
dan sertakan unit dalam nama field.
Sebagai contoh, karena encoding/json
tidak mendukung time.Duration
, unit disertakan dalam nama field.
Tidak disarankan:
// {"interval": 2}
type Config struct {
Interval int `json:"interval"`
}
Disarankan:
// {"intervalMillis": 2000}
type Config struct {
IntervalMillis int `json:"intervalMillis"`
}
Ketika time.Time
tidak dapat digunakan dalam interaksi ini, kecuali disepakati lain, gunakan string
dan format timestamp sesuai dengan RFC 3339. Secara default, Time.UnmarshalText
menggunakan format ini dan dapat digunakan dalam Time.Format
dan time.Parse
melalui time.RFC3339
.
Meskipun bukan masalah praktis, harap diketahui bahwa paket "time"
tidak mendukung parsing timestamp saat terjadi detik kabisat (8728), dan tidak memperhitungkan detik kabisat dalam perhitungan (15190). Jika Anda membandingkan dua waktu, perbedaannya tidak akan mencakup detik kabisat yang mungkin terjadi di antara dua waktu tersebut.