Menu
CoddyTech

Mengurai String Waktu

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 61 dari 68.

Terkadang kamu akan menerima informasi tanggal dan waktu sebagai string yang perlu dikonversi menjadi object time.Time untuk diproses. Go menyediakan fungsi time.Parse untuk menangani konversi ini.

Fungsi time.Parse bekerja sebagai kebalikan dari pemformatan: fungsi ini menerima string tata letak dan string waktu, lalu mengembalikan object time.Time:

dateString := "2023-10-26"
parsedTime, err := time.Parse("2006-01-02", dateString)
if err != nil {
    fmt.Println("Error parsing time:", err)
} else {
    fmt.Println(parsedTime)
}

Sama seperti pada pemformatan, kamu menggunakan komponen tanggal acuan yang sama dalam string tata letak. Tata letak "2006-01-02" memberi tahu Go untuk mengharapkan string input dalam format YYYY-MM-DD. Tata letak harus cocok dengan format persis string inputmu.

Ingat bahwa time.Parse mengembalikan dua nilai: object time.Time yang telah diuraikan dan error. Selalu periksa error untuk memastikan penguraian berhasil, karena string tanggal yang tidak valid atau tata letak yang tidak cocok akan menyebabkan penguraian gagal.

challenge icon

Tantangan

Mudah

Buat parser file log yang mengonversi string timestamp dari berbagai format menjadi object time.Time untuk dianalisis. Tantangan ini akan menguji kemampuanmu menggunakan time.Parse dengan berbagai pola layout untuk menangani beragam format tanggal dan waktu yang umum ditemukan dalam log sistem.

Catatan penting: Karena pesan log dan pola layout mungkin berisi spasi, kamu perlu menggunakan bufio.Scanner untuk membaca seluruh baris input. Fungsi fmt.Scanln berhenti membaca saat menemukan spasi pertama, sehingga entri log dan layout yang berisi spasi tidak akan terbaca dengan benar. Gunakan bufio.NewScanner(os.Stdin) dan panggil scanner.Scan() diikuti scanner.Text() untuk membaca seluruh baris.

Kamu akan menerima dua input:

  • Sebuah string berisi entri log dengan format "timestamp1:message1,timestamp2:message2,timestamp3:message3" (misalnya, "2023-10-26:System startup,2023/12/25:Holiday shutdown,Jan 15 2024:Maintenance window")
  • Sebuah string berisi pola layout yang dipisahkan dengan koma dengan format "layout1,layout2,layout3" (misalnya, "2006-01-02,2006/01/02,Jan 2 2006")

Tugasmu:

  1. Gunakan bufio.Scanner untuk membaca baris input dengan benar agar spasi dalam pesan log dan pola layout dapat ditangani
  2. Belah input pertama berdasarkan koma untuk mendapatkan setiap entri log
  3. Untuk setiap entri log, belah berdasarkan titik dua untuk mengambil string timestamp dan pesan
  4. Belah input kedua berdasarkan koma untuk mendapatkan pola layout
  5. Tampilkan header aplikasi: "=== LOG TIMESTAMP PARSER ==="
  6. Tampilkan status penguraian: "Processing log entries with multiple timestamp formats..."
  7. Untuk setiap entri log, coba uraikan timestamp menggunakan setiap pola layout hingga salah satunya berhasil:
    • Coba setiap pola layout dengan time.Parse hingga penguraian berhasil (tanpa error)
    • Jika berhasil, tampilkan: "Parsed: [timestamp_string] -> [parsed_time_object] (using layout: [successful_layout])"
    • Tampilkan juga: " Message: [log_message]"
    • Jika tidak ada layout yang cocok untuk sebuah timestamp, tampilkan: "Failed to parse: [timestamp_string] - no matching layout found"
  8. Setelah memproses semua entri, tampilkan statistik penguraian:
    • "=== PARSING RESULTS ==="
    • "Total log entries processed: [number_of_entries]"
    • "Successfully parsed timestamps: [number_of_successful_parses]"
    • "Failed parsing attempts: [number_of_failed_parses]"
  9. Tampilkan statistik penggunaan layout:
    • "Layout pattern usage:"
    • Untuk setiap pola layout: " [layout_pattern]: [number_of_times_used] times"
  10. Jika ada timestamp yang berhasil diuraikan, tampilkan analisis kronologis:
    • "=== CHRONOLOGICAL ANALYSIS ==="
    • "Earliest timestamp: [earliest_parsed_time]"
    • "Latest timestamp: [latest_parsed_time]"
    • "Time span covered: [time_difference_description]"
  11. Tampilkan pesan penyelesaian: "Log parsing completed - timestamps converted to time objects"

Gunakan package time untuk operasi penguraian, package strings untuk membelah string input, package bufio dan os untuk menangani input dengan benar, serta package fmt untuk output berformat. Ingat, time.Parse mengembalikan object time.Time dan error, kamu harus memeriksa error untuk menentukan apakah penguraian berhasil. Jika penguraian gagal dengan satu layout, coba pola layout berikutnya hingga menemukan yang cocok atau semua pilihan habis. Tantangan ini menunjukkan cara menangani berbagai format timestamp dalam pemrosesan log di dunia nyata.

Coba sendiri

package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
	"time"
)

func main() {
	// Buat scanner untuk membaca baris input
	scanner := bufio.NewScanner(os.Stdin)
	
	// Baca entri log
	scanner.Scan()
	logEntries := scanner.Text()
	
	// Baca pola tata letak
	scanner.Scan()
	layoutPatterns := scanner.Text()
	
	// Uraikan input
	entries := strings.Split(logEntries, ",")
	layouts := strings.Split(layoutPatterns, ",")
	
	// Inisialisasi penghitung untuk statistik
	totalEntries := len(entries)
	successfulParses := 0
	failedParses := 0
	layoutUsage := make(map[string]int)
	var parsedTimes []time.Time
	
	// TODO: Tulis kodemu di bawah ini
	// 1. Tampilkan judul aplikasi
	// 2. Tampilkan status pemrosesan
	// 3. Proses setiap entri log:
	//    - Pisahkan entri berdasarkan ":" untuk mendapatkan timestamp dan pesan
	//    - Coba setiap pola tata letak hingga ada yang cocok
	//    - Tampilkan hasil penguraian
	//    - Perbarui statistik
	// 4. Tampilkan statistik penguraian
	// 5. Tampilkan statistik penggunaan layout
	// 6. Jika timestamp berhasil diuraikan, tampilkan analisis kronologis
	// 7. Tampilkan pesan penyelesaian
	
}
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