Đị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.
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à:
- 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
- Dùng gói
strconvđể chuyển các giá trị chuỗi này thành số nguyên - Tạo một đối tượng
time.Timebằngtime.Datevới các giá trị đã phân tích (dùngtime.UTClàm múi giờ, đặt giây và nano giây là 0) - Hiển thị tiêu đề ứng dụng:
"=== DATE/TIME FORMATTER ===" - Hiển thị thời gian nguồn:
"Source time: [complete_time_object]" - 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
- Hiển thị tiêu đề định dạng:
"Formatted outputs:" - 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]"
- Với
- 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]"
- 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"
- 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
}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
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm7Xử lý lỗi chuyên sâu
Kiểu lỗi tùy chỉnhBọc lỗi bằng `%w`Gỡ bọc lỗi bằng `errors.Is`Gỡ bọc lỗi bằng `errors.As`Tìm hiểu `panic`Sử dụng `recover`Ôn tập: phép chia an toàn10Làm việc với thời gian
Lấy thời gian hiện tạiTạo thời điểm cụ thểĐịnh dạng thời gianPhân tích chuỗi thời gianKhoảng thời gianPhép tính thời gianTạm dừng và bộ đánh dấu thời gianÔn tập: Bộ hẹn giờ đơn giản2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành viTự luyện tập: Trình biên dịch Go online