Aritmetika Waktu
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 63 dari 68.
Setelah memahami object time.Time dan nilai time.Duration, kamu bisa melakukan operasi aritmetika untuk menghitung waktu di masa lalu atau masa depan. Go menyediakan dua method penting untuk aritmetika waktu: Add dan Sub.
Method Add menerima time.Duration dan mengembalikan time.Time baru yang merepresentasikan waktu awal ditambah durasinya:
now := time.Now()
tomorrow := now.Add(24 * time.Hour)
fmt.Println(tomorrow)method Sub bekerja dengan dua cara. Saat kamu mengurangkan satu time.Time dari yang lain, method ini mengembalikan time.Duration yang merepresentasikan selisih di antara keduanya:
start := time.Now()
end := start.Add(2 * time.Hour)
difference := end.Sub(start) // Mengembalikan 2h0m0sMethod-method ini memudahkan kamu menghitung tenggat waktu, mengukur waktu yang telah berlalu, atau menjadwalkan acara mendatang. Object time.Time asli tetap tidak berubah, kedua method mengembalikan nilai baru, sesuai dengan preferensi Go terhadap operasi yang tidak dapat diubah.
Tantangan
MudahBuat kalkulator tenggat proyek yang menggunakan aritmetika waktu untuk menentukan tonggak proyek dan tenggat. Tantangan ini akan menguji kemampuanmu menggunakan method Add dan Sub pada object time.Time untuk menghitung tanggal mendatang dan selisih waktu antara peristiwa.
Kamu akan menerima dua input:
- String yang berisi informasi awal proyek dalam format
"year:month:day:hour:minute"(misalnya,"2024:1:15:9:0") - String yang berisi durasi tugas dalam format
"task1:duration_value:duration_unit,task2:duration_value:duration_unit"(misalnya,"Planning:5:Day,Development:3:Week,Testing:10:Day")
Tugasmu adalah:
- Uraikan input pertama dengan memisahkannya berdasarkan titik dua untuk mengambil nilai tahun, bulan, hari, jam, dan menit
- Ubah nilai string ini menjadi bilangan bulat dan buat waktu awal proyek menggunakan
time.Date(gunakantime.UTCuntuk lokasi, serta 0 untuk detik dan nanodetik) - Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri tugas
- Untuk setiap entri tugas, pisahkan berdasarkan titik dua untuk mengambil nama tugas, nilai durasi, dan unit durasi
- Ubah nilai durasi menjadi bilangan bulat dan buat object
time.Durationmenggunakan konstanta yang sesuai:- Untuk
"Day": kalikan dengan24 * time.Hour - Untuk
"Week": kalikan dengan7 * 24 * time.Hour - Untuk
"Hour": kalikan dengantime.Hour
- Untuk
- Tampilkan header aplikasi:
"=== PROJECT DEADLINE CALCULATOR ===" - Tampilkan waktu awal proyek:
"Project start time: [start_time_object]" - Hitung tenggat tugas dengan menambahkan durasi setiap tugas ke waktu akhir tugas sebelumnya (tugas pertama dimulai pada waktu awal proyek):
- Untuk setiap tugas, tampilkan:
"Task: [task_name]"" Duration: [duration_object]"" Start: [task_start_time]"" End: [task_end_time]"(dihitung menggunakan methodAdd)
- Hitung dan tampilkan linimasa proyek:
"=== PROJECT TIMELINE ===""Project start: [start_time_object]""Project end: [final_task_end_time]""Total project duration: [total_duration_object]"(dihitung menggunakan methodSubantara waktu akhir dan waktu awal proyek)
- Tampilkan analisis tugas:
"=== TASK ANALYSIS ===""Number of tasks: [number_of_tasks]""Longest task: [longest_task_name] ([longest_duration_object])""Shortest task: [shortest_task_name] ([shortest_duration_object])"
- Hitung waktu antara tugas yang berurutan dan tampilkan jedanya:
"=== TASK TRANSITIONS ==="- Untuk setiap pasangan tugas yang berurutan:
"[first_task_name] to [second_task_name]: [time_difference_object]"(seharusnya 0 karena tugas-tugas berlangsung berurutan)
- Tampilkan statistik proyek:
"=== PROJECT STATISTICS ===""Total working days: [total_duration_in_hours_divided_by_24]""Total working hours: [total_duration_in_hours]""Project spans [number_of_calendar_days] calendar days"
- Tampilkan pesan penyelesaian:
"Project timeline calculation completed successfully"
Gunakan package time untuk operasi waktu, package strings untuk memisahkan string input, package strconv untuk mengubah string menjadi bilangan bulat, dan package fmt untuk output berformat. Ingat, method Add mengembalikan object time.Time baru yang mewakili waktu awal ditambah durasi, sedangkan method Sub mengembalikan time.Duration yang mewakili selisih antara dua waktu. Tantangan ini menunjukkan cara membuat linimasa proyek lengkap menggunakan operasi aritmetika waktu.
Coba sendiri
package main
import (
"fmt"
"strconv"
"strings"
"time"
)
func main() {
// Baca input
var startInfo string
var taskInfo string
fmt.Scanln(&startInfo)
fmt.Scanln(&taskInfo)
// Uraikan informasi waktu mulai
startParts := strings.Split(startInfo, ":")
year, _ := strconv.Atoi(startParts[0])
month, _ := strconv.Atoi(startParts[1])
day, _ := strconv.Atoi(startParts[2])
hour, _ := strconv.Atoi(startParts[3])
minute, _ := strconv.Atoi(startParts[4])
// Buat waktu mulai proyek
startTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
// Uraikan informasi tugas
taskEntries := strings.Split(taskInfo, ",")
// TODO: Tulis kodemu di bawah ini
// - Proses setiap entri tugas untuk mengambil nama, nilai durasi, dan satuan
// - Buat object durasi untuk setiap tugas
// - Hitung waktu mulai dan selesai setiap tugas
// - Temukan tugas terlama dan tersingkat
// - Hitung statistik proyek
// - Tampilkan semua bagian output yang diperlukan
// Output akan dihasilkan oleh implementasimu di atas
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas7Penanganan Error secara Mendalam
Tipe Error KustomMembungkus Error dengan `%w`Membuka Bungkus Error dengan `errors.Is`Membuka Bungkus Error dengan `errors.As`Memahami `panic`Menggunakan `recover`Rangkuman: Pembagian Aman10Bekerja dengan Waktu
Mendapatkan Waktu Saat IniMembuat Waktu TertentuMemformat WaktuMengurai String WaktuDurasi WaktuAritmetika WaktuTidur dan TickerRekap: Timer Sederhana2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online