Menu
CoddyTech

Định dạng thời gian

Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 60 trên 68.

Sau khi có một đối tượng time.Time, bạn thường cần chuyển đổi nó thành chuỗi có định dạng dễ đọc. Go dùng một cách định dạng thời gian độc đáo, khác với các ngôn ngữ lập trình khác.

Thay vì dùng các mã định dạng như %Y-%m-%d, Go dùng một ngày tham chiếu làm mẫu. Ngày tham chiếu này là Mon Jan 2 15:04:05 MST 2006, đại diện cho đúng thời điểm: ngày 2 tháng 1 năm 2006, lúc 3:04:05 chiều theo Giờ chuẩn miền núi.

now := time.Now()
formatted := now.Format("2006-01-02")
fmt.Println(formatted) // Đầu ra: 2023-10-26

Điểm mấu chốt là bạn sắp xếp các thành phần của ngày tham chiếu theo mẫu mình muốn. Với định dạng YYYY-MM-DD, bạn dùng "2006-01-02" vì đó là cách ngày tham chiếu hiển thị theo mẫu này. Với định dạng khác như Jan 2, 2006, bạn sẽ dùng "Jan 2, 2006".

Cách tiếp cận dựa trên bố cục này giúp việc định dạng thời gian trong Go vừa dễ nhớ vừa linh hoạt. Khi đã nhớ ngày tham chiếu, bạn có thể tạo bất kỳ định dạng nào bằng cách sắp xếp các thành phần theo mẫu mong muốn.

challenge icon

Thử thách

Dễ

Tạo một hệ thống hiển thị ngày giờ với nhiều định dạng, dùng các đối tượng time.Time theo hệ thống bố cục ngày tham chiếu độc đáo của Go. Thử thách này sẽ kiểm tra khả năng sử dụng phương thức Format với các mẫu bố cục khác nhau để tạo ra nhiều cách biểu diễn ngày giờ.

Bạn sẽ nhận được hai đầu vào:

  • Một chuỗi chứa thông tin ngày tháng theo định dạng "year:month:day:hour:minute" (ví dụ: "2023:12:25:14:30")
  • Một chuỗi chứa các yêu cầu định dạng, được phân tách bằng dấu phẩy theo định dạng "format1,format2,format3" (ví dụ: "iso,american,european,time12,time24")

Nhiệm vụ của bạn là:

  1. Phân tích đầu vào thứ nhất bằng cách tách theo dấu hai chấm để lấy các giá trị năm, tháng, ngày, giờ và phút
  2. Dùng gói strconv để chuyển các giá trị chuỗi này thành số nguyên
  3. Tạo một đối tượng time.Time bằng time.Date với các giá trị đã phân tích (dùng time.UTC làm múi giờ, đặt giây và nano giây là 0)
  4. Hiển thị tiêu đề ứng dụng: "=== DATE/TIME FORMATTER ==="
  5. Hiển thị thời gian nguồn: "Source time: [complete_time_object]"
  6. Phân tích đầu vào thứ hai bằng cách tách theo dấu phẩy để lấy các yêu cầu định dạng
  7. Hiển thị tiêu đề định dạng: "Formatted outputs:"
  8. Với mỗi yêu cầu định dạng, dùng chuỗi bố cục phù hợp cùng phương thức Format:
    • Với "iso": Dùng bố cục "2006-01-02" và hiển thị "ISO format: [formatted_result]"
    • Với "american": Dùng bố cục "01/02/2006" và hiển thị "American format: [formatted_result]"
    • Với "european": Dùng bố cục "02/01/2006" và hiển thị "European format: [formatted_result]"
    • Với "long": Dùng bố cục "January 2, 2006" và hiển thị "Long format: [formatted_result]"
    • Với "time12": Dùng bố cục "3:04 PM" và hiển thị "12-hour time: [formatted_result]"
    • Với "time24": Dùng bố cục "15:04" và hiển thị "24-hour time: [formatted_result]"
    • Với "full": Dùng bố cục "Monday, January 2, 2006 at 3:04 PM" và hiển thị "Full format: [formatted_result]"
    • Với "compact": Dùng bố cục "20060102" và hiển thị "Compact format: [formatted_result]"
  9. Tính toán và hiển thị thống kê:
    • "=== FORMATTING SUMMARY ==="
    • "Total formats applied: [number_of_format_requests]"
    • "Date components: [year]-[month]-[day]"
    • "Time components: [hour]:[minute]"
  10. Hiển thị thông tin tham khảo:
    • "=== REFERENCE DATE INFO ==="
    • "Go uses reference date: Mon Jan 2 15:04:05 MST 2006"
    • "This represents: January 2nd, 2006 at 3:04:05 PM"
    • "Layout patterns arrange these components as needed"
  11. Hiển thị thông báo hoàn tất: "Date formatting completed using Go's layout system"

Dùng gói time để xử lý thời gian, gói strings để tách chuỗi đầu vào, gói strconv để chuyển chuỗi thành số nguyên và gói fmt để định dạng đầu ra. Hãy nhớ rằng Go định dạng thời gian theo mẫu ngày tham chiếu Mon Jan 2 15:04:05 MST 2006, rồi bạn sắp xếp các thành phần này theo mẫu mình muốn. Thử thách này minh họa cách hoạt động của hệ thống định dạng dựa trên bố cục độc đáo của Go bằng cách yêu cầu bạn áp dụng nhiều mẫu định dạng khác nhau cho cùng một đối tượng thời gian.

Tự làm thử

package main

import (
	"fmt"
	"strconv"
	"strings"
	"time"
)

func main() {
	// Đọc dữ liệu đầu vào
	var dateInput string
	var formatInput string
	fmt.Scanln(&dateInput)
	fmt.Scanln(&formatInput)
	
	// Tách các thành phần ngày giờ theo dấu hai chấm
	dateComponents := strings.Split(dateInput, ":")
	
	// Chuyển các thành phần chuỗi thành số nguyên
	year, _ := strconv.Atoi(dateComponents[0])
	month, _ := strconv.Atoi(dateComponents[1])
	day, _ := strconv.Atoi(dateComponents[2])
	hour, _ := strconv.Atoi(dateComponents[3])
	minute, _ := strconv.Atoi(dateComponents[4])
	
	// Tạo đối tượng time.Time
	sourceTime := time.Date(year, time.Month(month), day, hour, minute, 0, 0, time.UTC)
	
	// Phân tích các yêu cầu định dạng
	formatRequests := strings.Split(formatInput, ",")
	
	// TODO: Viết code của bạn bên dưới
	// Hiển thị tiêu đề ứng dụng
	// Hiển thị thời gian gốc
	// Xử lý từng yêu cầu định dạng và hiển thị kết quả
	// Tính toán và hiển thị số liệu thống kê
	// Hiển thị thông tin tham khảo
	// Hiển thị thông báo hoàn tất
	
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch Go online