2.6 KiB
2.6 KiB
一 时间操作
1.1 创建时间
Golang中时间操作位于 time 包中,常见操作有:
// 当前时间
nowTime := time.Now()
fmt.Printf("当前时间为:%T\n", nowTime) // 其类型是 time.Time
fmt.Println(nowTime) // 2019-01-01 13:50:07.522712 +0800 CST m=+0.000138178
// 自定义时间
customTime := time.Date(2008, 7, 15, 13, 30,0,0, time.Local)
fmt.Println(customTime) // 2008-07-15 13:30:00 +0800 CST
1.2 时间格式化与解析
Go的时间格式化必须传入Go的生日:Mon Jan 2 15:04:05 -0700 MST 2006
nowTime := time.Now()
stringTime := nowTime.Format("2006年1月2日 15:04:05")
fmt.Println(stringTime) // 2019年01月01日 13:55:30
Go的时间解析:
stringTime := "2019-01-01 15:03:01"
objTime,_ := time.Parse("2006-01-02 15:04:05",stringTime)
fmt.Println(objTime) // 2019-01-01 15:03:01 +0000 UTC
注意:这些方法的参数模板必须与时间一一对应,否则报错!
1.3 获取 年 月 日
nowTime := time.Now()
year, month, day := nowTime.Date()
fmt.Println(year, month, day) // 2019 November 01
hour, min, sec := nowTime.Clock()
fmt.Println(hour, min, sec)
fmt.Println(nowTime.Year())
fmt.Println(nowTime.Month())
fmt.Println(nowTime.Hour())
fmt.Println(nowTime.YearDay()) // 指今年一共过了多少天
1.4 时间戳
时间戳是指计算时间距离 1970年1月1日的秒数:
nowTime := time.Now()
fmt.Println(nowTime.Unix())
1.5 时间间隔
nowTime := time.Now()
fmt.Println(nowTime.Add(time.Second * 10)) // 10秒后
fmt.Println(nowTime.AddDate(1, 0, 0)) // 1年后
贴士:
- 传入负数则是往前计算
- Sub()函数可以用来计算两个时间的差值
1.6 时间睡眠
time.Sleep(time.Second * 3) // 程序睡眠三秒钟
二 时间中的通道操作(定时器)
标准库中的Timer可以让用户自定义一个定时器,在用对select处理多个channel的超时、单channel读写的超时等情形时很方便:
timer := time.NewTimer(time.Second * 3) // 类型为 *time.Timer
ch := timer.C // timer内部包含一个通道
fmt.Println(<-ch) // 3秒后,通道内有了数据,可以取出
配合协程:
timer := time.NewTimer(time.Second * 3) // 类型为 *time.Timer
go func() {
<- timer.C
fmt.Println("timer 结束")
}()
time.Sleep(time.Second * 5)
flag := timer.Stop() // 取消定时器
fmt.Println(flag) // false
time.After函数的使用:
ch := time.After(time.Second * 3) // 底层其实是 new Timer(d).C
newTime := <-ch // 阻塞3秒
fmt.Println(newTime)