Menu
CoddyTech

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 2h0m0s

Method-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.

challenge icon

Tantangan

Mudah

Buat 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:

  1. Uraikan input pertama dengan memisahkannya berdasarkan titik dua untuk mengambil nilai tahun, bulan, hari, jam, dan menit
  2. Ubah nilai string ini menjadi bilangan bulat dan buat waktu awal proyek menggunakan time.Date (gunakan time.UTC untuk lokasi, serta 0 untuk detik dan nanodetik)
  3. Uraikan input kedua dengan memisahkannya berdasarkan koma untuk mendapatkan setiap entri tugas
  4. Untuk setiap entri tugas, pisahkan berdasarkan titik dua untuk mengambil nama tugas, nilai durasi, dan unit durasi
  5. Ubah nilai durasi menjadi bilangan bulat dan buat object time.Duration menggunakan konstanta yang sesuai:
    • Untuk "Day": kalikan dengan 24 * time.Hour
    • Untuk "Week": kalikan dengan 7 * 24 * time.Hour
    • Untuk "Hour": kalikan dengan time.Hour
  6. Tampilkan header aplikasi: "=== PROJECT DEADLINE CALCULATOR ==="
  7. Tampilkan waktu awal proyek: "Project start time: [start_time_object]"
  8. Hitung tenggat tugas dengan menambahkan durasi setiap tugas ke waktu akhir tugas sebelumnya (tugas pertama dimulai pada waktu awal proyek):
  9. Untuk setiap tugas, tampilkan:
    • "Task: [task_name]"
    • " Duration: [duration_object]"
    • " Start: [task_start_time]"
    • " End: [task_end_time]" (dihitung menggunakan method Add)
  10. 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 method Sub antara waktu akhir dan waktu awal proyek)
  11. 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])"
  12. 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)
  13. 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"
  14. 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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika & Alur

Latihan sendiri: Compiler Go online