我们大概就介绍完了多数涉及时间点与时间段的函数,接下面我们通过一些使用场景来做一些演示。
使用场景
日期时间差
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









