golang-時間和日期


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")
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM