golang常用库-时间操作常用库

262 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

time

时间与日期转换
func timeDemo() {
    now := time.Now() //获取当前时间
    fmt.Printf("current time:%v\n", now)

    year := now.Year()     //年
    month := now.Month()   //月
    day := now.Day()       //日
    hour := now.Hour()     //小时
    minute := now.Minute() //分钟
    second := now.Second() //秒
    fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)

    timestamp1 := now.Unix()     //时间戳
    timestamp2 := now.UnixNano() //纳秒时间戳
    fmt.Printf("current timestamp1:%v\n", timestamp1)
    fmt.Printf("current timestamp2:%v\n", timestamp2)   
    
    timeObj := time.Unix(timestamp1, 0)//时间戳转换成时间对象,再通过类似以上当前时间转换成时间格式

}
时间间隔(单位)

time包中时间间隔的定义:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second
    Hour                 = 60 * Minute
)
var _time = 10 * time.Second //10秒

例如:time.Duration表示1纳秒,time.Second表示1秒。

时间格式化

golang的常用时间格式化模板并不是常见的:Y-m-d H:i:s,而是2006-01-02 15:04 ,这是24小时制,2006-01-02 03:04 PM,则是12小时制

fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
// 12小时制
fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))
fmt.Println(now.Format("2006/01/02"))
时间操作

golang中的时间,并不是简单的数字加减,time包提供了实践操作的方法:

  • Add:时刻+时间段

    func main() {
        now := time.Now()
        later := now.Add(time.Hour) // 当前时间加1小时后的时间
        beforer := now.Add(-time.Hour) // 当前时间减1小时后的时间
        fmt.Println(later)
    }
    
  • Sub:时刻1 - 时刻2,求两个时间的差值,注意这里并不是(时刻-时间段)的实现,(时刻-时间段)仍然可以用Add(-时间段)来实现

  • Equal:判断时间是否相等,会考虑时区

  • Before:判断是否在某个时刻之前

  • After:判断是否在某个时刻之后

定时器

定时器,本质上是一个channel,golang中使用time.Ticker(duration)来设置定时器

  • 一次性定时器(延时)

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main() {
        /*
            用sleep实现定时器
        */
        fmt.Println(time.Now())
        time.Sleep(time.Second)
        fmt.Println(time.Now())
        /*
            用timer实现定时器
        */
        timer := time.NewTimer(time.Second)
        fmt.Println(<-timer.C)
        /*
            用after实现定时器
        */
        fmt.Println(<-time.After(time.Second))
    
    }
    
  • 周期性定时器

    func tickDemo() {
        ticker := time.Tick(time.Second) //定义一个1秒间隔的定时器
        //ticker := time.NewTicker(time.Second)
        for i := range ticker {
            fmt.Println(i)//每秒都会执行的任务
        }
    }