Lấy thời gian hiện tại
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 58 trên 68.
Khi làm việc với ngày tháng và thời gian trong chương trình Go, bạn sẽ cần dùng gói time tích hợp sẵn của Go. Gói này cung cấp mọi chức năng bạn cần để thực hiện các thao tác liên quan đến thời gian.
Cách bắt đầu phổ biến nhất là lấy thời gian hiện tại. Go giúp việc này trở nên đơn giản với hàm time.Now():
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println(now)
}Hàm time.Now() trả về một đối tượng time.Time biểu thị thời điểm hiện tại. Khi bạn in đối tượng này ra, nó hiển thị ngày và giờ theo định dạng dễ đọc, bao gồm thông tin múi giờ.
Đối tượng time.Time này chứa mọi thông tin về thời điểm cụ thể đó: năm, tháng, ngày, giờ, phút, giây và cả nano giây. Bạn sẽ dùng đối tượng này làm nền tảng cho mọi thao tác khác về thời gian trong Go.
Thử thách
DễTạo một ứng dụng theo dõi thời gian, ghi nhận thời gian hiện tại và hiển thị thời gian theo nhiều định dạng. Thử thách này sẽ kiểm tra khả năng sử dụng hàm time.Now() và làm việc với các đối tượng time.Time để trích xuất những thành phần khác nhau của thời điểm hiện tại.
Bạn sẽ nhận một đầu vào:
- Một chuỗi chứa các yêu cầu định dạng hiển thị, được phân tách bằng dấu phẩy theo định dạng
"format1,format2,format3"(ví dụ:"full,date,time,year,month,day")
Nhiệm vụ của bạn:
- Dùng
time.Now()để ghi nhận thời gian hiện tại và lưu vào một biến - Hiển thị tiêu đề ứng dụng:
"=== TIME TRACKER APPLICATION ===" - Hiển thị thông báo xác nhận đã ghi nhận dấu thời gian:
"Current time captured successfully" - Phân tích đầu vào bằng cách tách chuỗi theo dấu phẩy để lấy từng yêu cầu định dạng
- Hiển thị tiêu đề phần định dạng:
"Displaying time in requested formats:" - Với mỗi yêu cầu định dạng, hiển thị thông tin thời gian theo định dạng được chỉ định:
- Với
"full": Hiển thị"Full timestamp: [complete_time_object]" - Với
"date": Hiển thị"Date only: [year]-[month]-[day]"(dùng các thành phần từ phương thức Date()) - Với
"time": Hiển thị"Time only: [hour]:[minute]:[second]"(dùng các phương thức Hour(), Minute(), Second()) - Với
"year": Hiển thị"Year: [year_value]"(dùng phương thức Year()) - Với
"month": Hiển thị"Month: [month_name]"(dùng phương thức Month()) - Với
"day": Hiển thị"Day: [day_value]"(dùng phương thức Day()) - Với
"weekday": Hiển thị"Weekday: [weekday_name]"(dùng phương thức Weekday()) - Với
"unix": Hiển thị"Unix timestamp: [unix_seconds]"(dùng phương thức Unix())
- Với
- Đếm và hiển thị số liệu thống kê:
"=== TIME INFORMATION SUMMARY ===""Total formats displayed: [number_of_formats]""Timestamp components extracted: [number_of_unique_components]"
- Hiển thị thông tin thời gian bổ sung:
"Additional time details:""- Nanoseconds: [nanosecond_value]"(dùng phương thức Nanosecond())"- Location: [timezone_location]"(dùng phương thức Location())"- Is zero time: [true_or_false]"(dùng phương thức IsZero())
- Hiển thị thông báo hoàn tất:
"Time tracking completed - all requested formats processed"
Dùng gói time để làm việc với các đối tượng thời gian, gói strings để tách chuỗi đầu vào và gói fmt để định dạng đầu ra. Hãy nhớ rằng time.Now() trả về một đối tượng time.Time chứa mọi thông tin về thời điểm hiện tại. Bạn có thể trích xuất các thành phần cụ thể bằng những phương thức có sẵn của đối tượng này. Thử thách này hướng dẫn cách ghi nhận thời gian hiện tại và trích xuất những thông tin khác nhau từ một đối tượng time.Time.
Tự làm thử
package main
import (
"fmt"
"strings"
"time"
)
func main() {
// Đọc đầu vào
var formatRequests string
fmt.Scanln(&formatRequests)
// Dùng thời điểm cố định để đầu ra nhất quán (thời điểm tham chiếu của Go)
// Thay vì time.Now(), dùng time.Date để có kết quả dự đoán được
currentTime := time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)
// Tách các yêu cầu định dạng
formats := strings.Split(formatRequests, ",")
// TODO: Viết code bên dưới
// Hiển thị tiêu đề ứng dụng
// Hiển thị thông báo xác nhận đã ghi nhận dấu thời gian
// Hiển thị tiêu đề phần định dạng
// Xử lý từng yêu cầu định dạng và hiển thị kết quả tương ứng
// Dùng map để theo dõi các thành phần không trùng lặp khi đếm
// Dùng định dạng phù hợp (ví dụ: %02d cho số có thêm số 0 ở đầu)
// Hiển thị thống kê tổng hợp
// Hiển thị thêm thông tin chi tiết về thời gian
// 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