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.
Tantangan
MudahBuat 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:
- Gunakan
bufio.Scanneruntuk membaca baris input dengan benar agar spasi dalam pesan log dan pola layout dapat ditangani - Belah input pertama berdasarkan koma untuk mendapatkan setiap entri log
- Untuk setiap entri log, belah berdasarkan titik dua untuk mengambil string timestamp dan pesan
- Belah input kedua berdasarkan koma untuk mendapatkan pola layout
- Tampilkan header aplikasi:
"=== LOG TIMESTAMP PARSER ===" - Tampilkan status penguraian:
"Processing log entries with multiple timestamp formats..." - Untuk setiap entri log, coba uraikan timestamp menggunakan setiap pola layout hingga salah satunya berhasil:
- Coba setiap pola layout dengan
time.Parsehingga 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"
- Coba setiap pola layout dengan
- 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]"
- Tampilkan statistik penggunaan layout:
"Layout pattern usage:"- Untuk setiap pola layout:
" [layout_pattern]: [number_of_times_used] times"
- 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]"
- 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
}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