A.8. Time, Parsing Time, & Format Time

Pada bab ini kita akan belajar tentang pemanfaatan data bertipe waktu, method-method yang disediakan, dan juga format & parsing data string ke tipe time.Time dan sebaliknya.

Golang menyediakan package time yang berisikan banyak sekali komponen yang bisa digunakan untuk keperluan pemanfaatan waktu. Salah satunya adalah time.Time, yang merupakan tipe untuk data tanggal dan waktu di Golang.

Time disini maksudnya adalah gabungan date dan time, bukan hanya waktu saja.

A.8.1. Penggunaan time.Time

time.Time adalah tipe data untuk objek waktu. Ada 2 cara yang bisa digunakan untuk membuat data bertipe ini.

  • Menjadikan informasi waktu sekarang sebagai objek time.Time.
  • Membuat objek baru bertipe time.Time dengan informasi ditentukan sendiri.

Berikut merupakan contoh penggunannya.

package main

import "fmt"
import "time"

func main() {
    var time1 = time.Now()
    fmt.Printf("time1 %v\n", time1)
    // time1 2015-09-01 17:59:31.73600891 +0700 WIB

    var time2 = time.Date(2011, 12, 24, 10, 20, 0, 0, time.UTC)
    fmt.Printf("time2 %v\n", time2)
    // time2 2011-12-24 10:20:00 +0000 UTC
}

Fungsi time.Now() mengembalikan objek time.Time dengan informasi adalah waktu sekarang, waktu tepat ketika statement tersebut dijalankan. Bisa dilihat ketika di tampilkan, informasi yang muncul adalah sesuai dengan tanggal program tersebut dieksekusi.

Penggunaan time

Fungsi time.Date() digunakan untuk membuat objek time.Time baru yang informasi waktunya kita tentukan sendiri. Fungsi ini memiliki 8 buah parameter mandatory dengan skema bisa dilihat di kode berikut:

time.Date(tahun, bulan, tanggal, jam, menit, detik, nanodetik, timezone)

Objek cetakan fungsi time.Now(), informasi timezone-nya adalah relatif terhadap lokasi kita. Karena kebetulan penulis berlokasi di Jawa Timur, maka akan terdeteksi masuk dalam GMT+7 atau WIB. Berbeda dengan variabel time2 yang lokasinya sudah kita tentukan secara eksplisit yaitu UTC.

Selain menggunakan time.UTC untuk penentuan lokasi, tersedia juga time.Local yang nilainya adalah relatif terhadap waktu lokal kita.

A.8.2. Method Milik time.Time

Tipe data time.Time merupakan struct, memiliki beberapa method yang bisa dipakai.

var now = time.Now()
fmt.Println("year:", now.Year(), "month:", now.Month())
// year: 2015 month: 8

Kode di atas adalah contoh penggunaan beberapa method milik objek bertipe time.Time. Method Year() mengembalikan informasi tahun, dan Month() mengembalikan informasi angka bulan.

Selain kedua method di atas, ada banyak lagi yang bisa dimanfaatkan. Tabel berikut merupakan list method yang berhubungan dengan date, time, dan location yang dimiliki tipe time.Time.

MethodReturn TypePenjelasan
now.Year()intTahun
now.YearDay()intHari ke-? di mulai awal tahun
now.Month()intBulan
now.Weekday()stringNama hari. Bisa menggunakan now.Weekday().String() untuk mengambil bentuk string-nya
now.ISOWeek()(int, int)Tahun dan minggu ke-? mulai awal tahun
now.Day()intTanggal
now.Hour()intJam
now.Minute()intMenit
now.Second()intDetik
now.Nanosecond()intNano detik
now.Local()time.TimeWaktu dalam timezone lokal
now.Location()*time.LocationMengambil informasi lokasi, apakah local atau utc. Bisa menggunakan now.Location().String() untuk mengambil bentuk string-nya
now.Zone()(string, int)Mengembalikan informasi timezone offset dalam string dan numerik. Sebagai contoh WIB, 25200
now.IsZero()boolDeteksi apakah nilai object now adalah 01 Januari tahun 1, 00:00:00 UTC. Jika iya maka bernilai true
now.UTC()time.TimeWaktu dalam timezone UTC
now.Unix()int64Waktu dalam format unix time
now.UnixNano()int64Waktu dalam format unix time. Infomasi nano detik juga dimasukkan
now.String()stringWaktu dalam string

A.8.3. Parsing time.Time

Data string bisa dikonversi menjadi time.Time dengan memanfaatkan time.Parse. Fungsi ini membutuhkan 2 parameter:

  • Parameter ke-1 adalah layout format dari data waktu yang akan diparsing.
  • Parameter ke-2 adalah data string yang ingin diparsing.

Contoh penerapannya bisa dilihat di kode berikut.

var layoutFormat, value string
var date time.Time

layoutFormat = "2006-01-02 15:04:05"
value = "2015-09-02 08:04:00"
date, _ = time.Parse(layoutFormat, value)
fmt.Println(value, "\t->", date.String())
// 2015-09-02 08:04:00 +0000 UTC

layoutFormat = "02/01/2006 MST"
value = "02/09/2015 WIB"
date, _ = time.Parse(layoutFormat, value)
fmt.Println(value, "\t\t->", date.String())
// 2015-09-02 00:00:00 +0700 WIB

Contoh penggunaan **time.Parse**

Layout format time di golang berbeda dibanding bahasa lain. Umumnya layout format yang digunakan adalah seperti "DD/MM/YYYY", di Golang tidak.

Golang memiliki standar layout format yang cukup unik, contohnya seperti pada kode di atas "2006-01-02 15:04:05". Golang menggunakan 2006 untuk parsing tahun, bukan YYYY; 01 untuk parsing bulan; 02 untuk parsing hari; dan seterusnya. Detailnya bisa dilihat di tabel berikut.

Layout FormatPenjelasanContoh Data
2006Tahun 4 digit2015
006Tahun 3 digit015
06Tahun 2 digit15
01Bulan 2 digit05
1Bulan 1 digit jika dibawah bulan 10, selainnya 2 digit512
JanuaryNama bulan dalam bahasa inggrisSeptemberAugust
JanNama bulan dalam bahasa inggris, 3 hurufSepAug
02Tanggal 2 digit02
2Tanggal 1 digit jika dibawah bulan 10, selainnya 2 digit831
MondayNama hari dalam bahasa inggrisSaturdayFriday
MonNama hari dalam bahasa inggris, 3 hurufSatFri
15Jam dengan format 24 jam18
03Jam dengan format 12 jam 2 digit0511
3Jam dengan format 12 jam 1 digit jika dibawah jam 11, selainnya 2 digit511
PMAM/PM, biasa digunakan dengan format jam 12 jamPMAM
04Menit 2 digit08
4Menit 1 digit jika dibawah menit 10, selainnya 2 digit824
05Detik 2 digit06
5Detik 1 digit jika dibawah detik 10, selainnya 2 digit636
999999Nano detik124006
MSTLokasi timezoneUTCWIBEST
Z0700Offset timezoneZ+0700-0200

A.8.4. Predefined Layout Format Untuk Keperluan Parsing Time

Golang juga menyediakan beberapa predefined layout format umum yang bisa dimanfaatkan. Jadi tidak perlu menuliskan kombinasi komponen-komponen layout format.

Salah satu predefined layout yang bisa digunakan adalah time.RFC822. Format ini sama dengan 02 Jan 06 15:04 MST. Berikut adalah contoh penerapannya.

var date, _ = time.Parse(time.RFC822, "02 Sep 15 08:00 WIB")
fmt.Println(date.String())
// 2015-09-02 08:00:00 +0700 WIB

Ada beberapa layout format lain yang tersedia, silakan lihat tabel berikut.

Predefined Layout FormatLayout Format
time.ANSICMon Jan _2 15:04:05 2006
time.UnixDateMon Jan _2 15:04:05 MST 2006
time.RubyDateMon Jan 02 15:04:05 -0700 2006
time.RFC82202 Jan 06 15:04 MST
time.RFC822Z02 Jan 06 15:04 -0700
time.RFC850Monday, 02-Jan-06 15:04:05 MST
time.RFC1123Mon, 02 Jan 2006 15:04:05 MST
time.RFC1123ZMon, 02 Jan 2006 15:04:05 -0700
time.RFC33392006-01-02T15:04:05Z07:00
time.RFC3339Nano2006-01-02T15:04:05.999999999Z07:00
time.Kitchen3:04PM
time.StampJan _2 15:04:05
time.StampMilliJan _2 15:04:05.000
time.StampMicroJan _2 15:04:05.000000
time.StampNanoJan _2 15:04:05.000000000

A.8.5. Format time.Time

Setelah sebelumnya kita belajar tentang cara konversi data dengan tipe string ke time.Time. Kali ini kita akan belajar kebalikannya, konversi time.Time ke string.

Method Format() milik tipe time.Time digunakan untuk membentuk output string sesuai dengan layout format yang diinginkan. Contoh bisa dilihat pada kode berikut.

var date, _ = time.Parse(time.RFC822, "02 Sep 15 08:00 WIB")

var dateS1 = date.Format("Monday 02, January 2006 15:04 MST")
fmt.Println("dateS1", dateS1)
// Wednesday 02, September 2015 08:00 WIB

var dateS2 = date.Format(time.RFC3339)
fmt.Println("dateS2", dateS2)
// 2015-09-02T08:00:00+07:00

Variabel date di atas berisikan hasil parsing data dengan format time.RFC822. Data tersebut kemudian diformat sebagai string 2 kali dengan layout format berbeda.

Contoh penggunaan method `Format()`

A.8.6. Handle Error Parsing time.Time

Ketika parsing string ke time.Time, sangat memungkinkan bisa terjadi error karena struktur data yang akan diparsing tidak sesuai layout format yang digunakan.

Error tidaknya parsing bisa diketahui lewat nilai kembalian ke-2 fungsi time.Parse. Berikut adalah contoh penerapannya.

var date, err = time.Parse("06 Jan 15", "02 Sep 15 08:00 WIB")

if err != nil {
    fmt.Println("error", err.Error())
    return
}

fmt.Println(date)

Kode di atas menghasilkan error karena format tidak sesuai dengan skema data yang akan diparsing. Layout format yang seharusnya digunakan adalah 06 Jan 15 03:04 MST.

Error parsing time.Time

results matching ""

No results matching ""