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")
}
