Skip to main content

时间操作

一 时间操作

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)