golang snippet 之 time 使用

時間格式化與解析

// 獲取當前時間
t := time.Now() // 2020-05-13 22:23:56.253851 +0800 CST m=+0.001626130
fmt.Println(t)

//獲取當前年月日,時分秒
y := t.Year()                 //年
m := t.Month()                //月
d := t.Day()                  //日
h := t.Hour()                 //小時
i := t.Minute()               //分鐘
s := t.Second()               //秒
fmt.Println(y, m, d, h, i, s) // 2020 May 13 22 41 20

// 獲取當前時間戳 (int64 數字)
timestamp := t.Unix() // 1589379836
fmt.Println(timestamp)

// 時間 -> 字符串,注意,格式化字符串 2006-01-02 15:04:05
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2020-05-13 22:23:56

// 字符串時間 ->時間戳(帶時區)
loc, _ := time.LoadLocation("Asia/Shanghai")                                     //設置時區
tt, _ := time.ParseInLocation("2006-01-02 15:04:05", "2020-05-13 22:23:56", loc) //2006-01-02 15:04:05是轉換的格式
fmt.Println(tt.Unix())                                                           // 1589379836

// 字符串時間 ->時間戳(不帶時區)
ttt, _ := time.Parse("2006-01-02 15:04:05", "2020-05-13 22:23:56")
fmt.Println(ttt.Format("2006-01-02 15:04:05"))

// 時間戳 -> 時間
tm := time.Unix(1531293019, 0)
fmt.Println(tm.Format("2006-01-02 15:04:05")) //2018-07-11 15:10:19

計算時間差

start := time.Now()
time.Sleep(2 * time.Second)
t := time.Now()
elapsed := t.Sub(start)

fmt.Println(elapsed)           // 2.002571917s
fmt.Println(elapsed.Seconds()) // 2.000620669 (float64類型),還能夠轉換成 hours / minutes 等

// Since is shorthand for time.Now().Sub(t).
fmt.Println(time.Since(start)) // 2.002534752s

定時器使用

// 使用 Ticker
// 定時器,週期性觸發
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
    time.Sleep(10 * time.Second)
    done <- true
}()
for {
    select {
    case <-done:
        fmt.Println("Done!")
        return
    case t := <-ticker.C:
        fmt.Println("Current time: ", t)
    }
}

// 使用 Timer
// 定時器,一次觸發
goon := true
timer := time.NewTimer(2 * time.Second)
// 防止內存泄漏,不用 stop 關閉,stop 不會關閉 channel
defer timer.Reset(0)
go func() {
    <-timer.C
    goon = false
}()
for goon {
    fmt.Println("loop")
    time.Sleep(time.Second)
}

更多使用技巧參考 godoc https://www.godoc.org/timeoop

相關文章
相關標籤/搜索