Skip to content

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

go
func Now() Time
go
now := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001

Kiể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.

go
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

go
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ụ

go
now := time.Now()

Định dạng đầu ra 24 giờ

go
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Nov

Chỉ đầu ra ngày

go
fmt.Println(now.Format("2006-01-02"))
//2022-11-17

Chỉ đầu ra thời gian 12 giờ

go
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AM

Phâ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 đó.

go
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 CST

Timer

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.

go
func NewTimer(d Duration) *Timer

Có thể tạo một bộ đếm thời gian mới thông qua time.NewTimer()

sh
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.007908001

Sau 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ỳ.

go
func NewTicker(d Duration) *Ticker

Có thể tạo một bộ định thời mới thông qua time.NewTicker()

go
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.016742001

Tươ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.

go
func Sleep(d Duration)
sh
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.

Golang by www.golangdev.cn edit