over-golang/01-基础语法/14-时间操作.md
2021-07-02 18:11:59 +08:00

2.6 KiB
Raw Permalink Blame History

一 时间操作

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)