Golang中常用的标准库之time

常用数据类型

  • Time:时间,以纳秒精度表示时间中的一个瞬间。
  • Duration:持续时间以int64纳秒计数表示两个瞬间之间经过的时间。
  • Ticker:一个channel,该channel每隔一段时间发送当前时间。

Time

表示时间,可以以多种形式返回这个时间的具体信息

1
now := time.Now() // time.Time

返回不同时间不同格式

1
2
3
4
5
6
7
fmt.Println(now.Second()) // 返回秒
fmt.Println(now.Day()) // 返回天
fmt.Println(now.Clock()) // 返回 "小时 分钟 秒" 时钟
fmt.Println(now.Date()) // 返回 "年 月 日"日期
fmt.Println(now.Weekday()) // 返回周几
fmt.Println(now.Format("Mon Jan 2 15:04:05 MST 2006")) // 按照这个格式返回,注意,这里必须按照1月2号下午3点4分5秒2006年的格式填写
fmt.Println(time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)) // 返回这个时间节点的time格式时间

时间解析

1
2
3
4
t1 := "2022-07-21 15:09:36.874858"
t2 := "2006-01-02 15:04:05"
parse1, err := time.Parse(t2, t1) // 将t1时间按照t2格式展示
parse2, _ := time.ParseInLocation(t2, t1, time.Local) // 将t1时间按照t2格式展示,并且指定市区为local

对时间操作

1
2
3
4
5
6
7
8
9
10
fmt.Println(time.Now().Unix()) // 返回时间戳
time.Now().Nanosecond() 纳秒时间戳
time.Unix(timestamp, 0).Local() // 时间戳转换为时间,时区为当地时间

// 统计时间间隔
start := time.Now()
//...func
fmt.Println(time.Since(start))

start.Add(time.Hour * 1) // 返回一小时之后的时间

判断时间顺序

1
now.After(after) // 返回now的时间点是否比after后

Dutation

两个时间的间隔,可以用于计算两个时间的差,或者在sleep中常用

1
2
3
4
t1 := time.Now()
//
t2 := time.Now()
fmt.Println(t2.Sub(t1))

sleep需要传入duration

1
time.Sleep(time.Duration(1) * time.Second)

Ticker

定时器和倒计时,通过一个channel实现定时和倒计时的功能。

1
2
3
4
5
6
7
8
9
10
11
tick := time.Tick(time.Second)
after := time.After(5 * time.Second)
for {
select {
case c := <-tick:
fmt.Printf("tick clock: %v\n", c)
case d := <-after:
fmt.Printf("time up: %v\n", d)
return
}
}

输出

1
2
3
4
5
6
tick clock: 2022-07-26 16:43:38.303502 +0800 CST m=+1.000336793
tick clock: 2022-07-26 16:43:39.304435 +0800 CST m=+2.001268376
tick clock: 2022-07-26 16:43:40.303358 +0800 CST m=+3.000189376
tick clock: 2022-07-26 16:43:41.303761 +0800 CST m=+4.000590835
tick clock: 2022-07-26 16:43:42.303389 +0800 CST m=+5.000217585
time up: 2022-07-26 16:43:42.303396 +0800 CST m=+5.000223668