目录

一 时间操作

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)