golang中的時間模塊,是由time包來完成實現的
time.Time 類型,用來表示時間
獲取當前時間 now := time.Now()
簡單示例
表示年月日,時分秒,並且格式化輸出,休眠
now := time.Now()
year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
fmt.Printf("now is %v,day is %v,minute is %v,month is %v,year is %v\n", now, day, minute, month, year)
fmt.Printf("formart out: %02d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
//結果:now is 2020-10-13 11:09:10.1265396 +0800 CST m=+0.005983801,day is 13,minute is 9,month is October,year is 2020
//格式化輸出: formart out: 2020-10-13 11:10:20
// 休眠1秒
// time.Millisecond 表示1毫秒
// time.Microsecond 表示1微妙
// time.Nanosecond 表示1納秒
time.Sleep(1 * time.Second)
// 休眠100毫秒
time.Sleep(100 * time.Millisecond)
時間長度
時間常量
type Duration int64
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
//時間加減
//time.ParseDuration(s string) (Duration, error) 傳入時間的信息,返回一個時間結果和error
// 減去7分鍾
m, _ := time.ParseDuration("-7m")
// 加上10秒
s, _ := time.ParseDuration("10s")
fmt.Println(m, s)
/*
-7m0s 10s
*/
time.Duration
表示時間長度- 以納秒為基數
- 底層數據類型為int64
- int64 類型的變量不能直接和
time.Duration
類型相乘,需要顯示轉換,常量除外- 不行:
num * time.Second
- 可以:
time.Duration(num) * time.Second
- 可以:
5 * time.Second
- 不行:
獲取當前時間戳
方法:time.Now().Unix()
func timetotamp(timetamp int64) {
timeObj := time.Unix(timetamp, 0) //使用時間戳來獲取年月日的數據
year := timeObj.Year()
month := timeObj.Month()
day := timeObj.Day()
hour := timeObj.Hour()
minute := timeObj.Minute()
second := timeObj.Second()
fmt.Printf("%02d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
fmt.Printf("時間戳是:%d\n", timetamp)
}
func main() {
timetamp := time.Now().Unix()
timetotamp(timetamp)
}
/* 結果:
2020-10-13 11:14:17
時間戳是:1602558857
*/
time的格式化
方法:time.Now().Format()
now := time.Now()
fmt.Println(now.Format("02/1/2006 15:04"))
fmt.Println(now.Format("2006/1/02 15:04"))
fmt.Println(now.Format("2006/1/02"))
/*
使用time的format函數,進行格式化輸出,這里format函數傳入的參數時間是固定的,格式可以改變,此時間為golang語言誕生時間
結果:
13/10/2020 11:16
2020/10/13 11:16
2020/10/13
*/
將字符串時間,轉換為時間格式
方法:time.Parse(),返回轉換后的時間格式和一個判斷信息(err)
now := "2020-10-11"
tm1, err := time.Parse("2006-01-02", now)
fmt.Printf("%T\n", tm1)
fmt.Printf("%s\n", tm1)
/*
time.Time
2020-10-11 00:00:00 +0000 UTC
*/
獲取前一天或者后一天時間
//當前時間的前一天時間
d1 := time.Now().Add(-24 * time.Hour).Format("2006-01-02 15:04:05")
//當前時間的前一年的后兩個的前三天
d2 := time.Now().AddDate(-1, 2, -3).Format("2006-01-02 15:04:05")
fmt.Printf("d1 = %v ; d2 = %v\n", d1, d2)
/*
d1 = 2020-10-12 11:36:57 ; d2 = 2019-12-10 11:36:57
*/
定時器的使用
time.Tick
使用time.Tick()方法來實現
簡單示例:
ticker := time.Tick(time.Second * 10)
for i := range ticker {
fmt.Printf("%v\n", i)
//在這個定時器中,可以執行相關的定時任務
}
注意:
- time.Tick 是對time.NewTicker的簡化
- 不要在for循環內設置Tick,這樣會造成CPU暴漲
- 例如: for i := range time.Tick(time.Second * 10) 不可取
- 這樣會導致每次循環都創建一個計時器,即每次循環的時候都會創建一個管道
- 應該定義在循環前
- time.Tick 僅僅應用在整個生命周期都需要時,才合適
- 否則應該使用time.NewTicker 並手動停止
- time.Tick函數的行為很像創建一個計時器(goroutine)在循環里面調用 定時的任務 ,然后在它每次循環是發送事件
- 如果停止監聽,但是計時器還在運行,徒勞的向一個沒有計時器的管道中發送任務
- 這樣會導致計時器泄露
time.NewTicker
自定義一個tick,同樣不能使用在for循環 內,這個需要手動的關閉計時器
ticker := time.NewTicker(time.Second * 2)
defer ticker.Stop()
for range ticker.C {
fmt.Println("hello world")
}