Penanganan waktu cukup kompleks. Asumsi umum yang salah tentang waktu termasuk hal berikut.

  1. Sehari terdiri dari 24 jam.
  2. Sejam terdiri dari 60 menit.
  3. Seminggu terdiri dari tujuh hari.
  4. 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:

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.