golang package time的用法具体详解

2020-01-28 13:08:50于丽

我们大概就介绍完了多数涉及时间点与时间段的函数,接下面我们通过一些使用场景来做一些演示。

使用场景

日期时间差


dt1 := time.Date(2018, 1, 10, 0, 0, 1, 100, time.Local)
 dt2 := time.Date(2018, 1, 9, 23, 59, 22, 100, time.Local)
 // 不用关注时区,go会转换成时间戳进行计算
 fmt.Println(dt1.Sub(dt2))

基于当前时间的前后运算


now := time.Now()

 // 一年零一个月一天之后
 fmt.Println(now.Date(1,1,1))
 // 一段时间之后
 fmt.Println(now.Add(time.Duration(10)*time.Minute))

 // 计算两个时间点的相差天数
 dt1 = time.Date(dt1.Year(), dt1.Month(), dt1.Day(), 0, 0, 0, 0, time.Local)
 dt2 = time.Date(dt2.Year(), dt2.Month(), dt2.Day(), 0, 0, 0, 0, time.Local)
 fmt.Println(int(math.Ceil(dt1.Sub(dt2).Hours() / 24)))

时区转换


// time.Local 用来表示当前服务器时区
 // 自定义地区时间
 secondsEastOfUTC := int((8 * time.Hour).Seconds())
 beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
 fmt.Println(time.Date(2018,1,2,0,0,0,0, beijing)) // 2018-01-02 00:00:00 +0800 Beijing Time 

 // 当前时间转为指定时区时间
 fmt.Println(time.Now().In(beijing))

 // 指定时间转换成指定时区对应的时间
 dt, err := time.ParseInLocation("2006-01-02 15:04:05", "2017-05-11 14:06:06", time.Local)

 // 当前时间在零时区年月日 时分秒 时区
 year, mon, day := time.Now().UTC().Date() // 2018 April 24 
 hour, min, sec := time.Now().UTC().Clock() // 3 47 15
 zone, _ := time.Now().UTC().Zone()  // UTC

比较两个时间点


dt := time.Date(2018, 1, 10, 0, 0, 1, 100, time.Local)
 fmt.Println(time.Now().After(dt)) // true
 fmt.Println(time.Now().Before(dt)) // false

 // 是否相等 判断两个时间点是否相等时推荐使用 Equal 函数
 fmt.Println(dt.Equal(time.Now()))

设置执行时间

通过 time.After 函数与 select 结合使用可用于处理程序超时设定


select {
 case m := <- c:
  // do something
 case <- time.After(time.Duration(1)*time.Second):
  fmt.Println("time out")
 }

Ticker类型

Ticker 类型包含一个 channel ,有时我们会遇到每隔一段时间执行的业务(比如设置心跳时间等),就可以用它来处理,这是一个 重复的过程


// 无法取消
 tick := time.Tick(1 * time.Minute)
 for _ = range tick {
  // do something
 }

 // 可通过调用ticker.Stop取消
 ticker := time.NewTicker(1 * time.Minute)
 for _ = range tick {
  // do something
 }

Timer类型

Timer 类型用来代表一个单独的事件,当设置的时间过期后,发送当前的时间到 channel , 我们可以通过以下两种方式来创建


func AfterFunc(d Duration, f func()) *Timer // 指定一段时间后指定的函数
 func NewTimer(d Duration) *Timer