time
Gói time cung cấp các hàm và phương thức liên quan đến thời gian và lịch.
Hàm time.Now() có thể lấy thời gian hiện tại
func Now() Timenow := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001Kiểu dữ liệu trả về là cấu trúc Time, có rất nhiều phương thức thao tác thời gian.
func (t *Time) nsec() int32 //Nano giây
func (t *Time) sec() int64 //Giây
func (t *Time) unixSec() //Trả về giây theo định dạng thời gian Unix
func (t *Time) addSec(d int64) //Thêm giây
func (t *Time) setLoc(loc *Location) //Đặt khu vực
func (t *Time) stripMono() //Bỏ đọc đồng hồ đơn điệu của thời gian
func (t Time) After(u Time) //Kiểm tra xem một thời gian có ở sau nó không
func (t Time) Before(u Time) bool //Kiểm tra xem một thời gian có ở trước nó không
func (t Time) Equal(u Time) bool //Kiểm tra xem hai thời gian có biểu thị cùng một thời điểm không
func (t Time) Sub(u Time) Duration //Tính hiệu giữa hai thời gian
func (t Time) Add(d Duration) Time //Thêm một khoảng thời gianĐơn vị thời gian
Gói time lưu trữ các hằng số đơn vị thời gian cơ bản
const (
minDuration Duration = -1 << 63
maxDuration Duration = 1<<63 - 1
)
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)Kiểu của chúng là time.Duration, đơn vị nhỏ nhất là nano giây, lớn nhất là giờ.
Định dạng
Kiểu thời gian có thể được định dạng đầu ra, nhưng cần lưu ý là template định dạng trong Go không phải là yyyy-mm-dd thường gặp, mà là template dựa trên thời gian Go ra đời. Thời gian Go ra đời là ngày 2 tháng 1 năm 2006 lúc 3 giờ 4 phút chiều.
Ví dụ
now := time.Now()Định dạng đầu ra 24 giờ
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday NovChỉ đầu ra ngày
fmt.Println(now.Format("2006-01-02"))
//2022-11-17Chỉ đầu ra thời gian 12 giờ
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AMPhân tích thời gian
Thông thường chúng ta sẽ có nhu cầu là, chuyển đổi thời gian chuỗi theo một định dạng nhất định thành cấu trúc thời gian trong Go, tiếp theo chúng ta sẽ làm việc đó.
func main() {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
inLocation, err := time.ParseInLocation("2006/01/02", "2012/10/12", location)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(inLocation.String())
}Đầu ra cuối cùng
2012-10-12 00:00:00 +0800 CSTTimer
Timer là một bộ đếm thời gian, expose một channel ra bên ngoài, khi thời gian chỉ định đến, channel sẽ nhận được thông báo và đóng.
func NewTimer(d Duration) *TimerCó thể tạo một bộ đếm thời gian mới thông qua time.NewTimer()
func main() {
timer := time.NewTimer(time.Second)
defer timer.Stop()
select {
case t := <-timer.C:
fmt.Println(t)
}
}2023-09-25 21:25:03.5696803 +0800 CST m=+1.007908001Sau khi sử dụng timer, nên đóng kịp thời.
Ticker
Ticker là một bộ định thời, khác với timer ở chỗ, timer là một lần, còn Ticker là kích hoạt định kỳ.
func NewTicker(d Duration) *TickerCó thể tạo một bộ định thời mới thông qua time.NewTicker()
func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for i := 0; i < 3; i++ {
select {
case t := <-ticker.C:
fmt.Println(t)
}
}
}2023-09-25 21:29:20.4429256 +0800 CST m=+1.009508401
2023-09-25 21:29:21.4512075 +0800 CST m=+2.017790301
2023-09-25 21:29:22.4501592 +0800 CST m=+3.016742001Tương tự, sau khi sử dụng ticker, cũng nên đóng kịp thời.
sleep
time.Sleep() có thể khiến goroutine hiện tại ở trạng thái treo trong một khoảng thời gian nhất định, trong thời gian này goroutine sẽ bị chặn cho đến khi khôi phục trạng thái chạy.
func Sleep(d Duration)func main() {
start := time.Now()
fmt.Println(start)
time.Sleep(time.Second * 2)
end := time.Now()
fmt.Println(end)
}2023-09-25 21:36:35.7229057 +0800 CST m=+0.001627901
2023-09-25 21:36:37.7347742 +0800 CST m=+2.013496401Đoạn chương trình trên sẽ chặn hai giây sau khi xuất ra start, sau đó xuất ra end.
