Golang入門-時間處理

獲取當前時間

import time

func getCurTime() {
	// 本地時間(若是是在中國,獲取的是東八區時間)
	curLocalTime := time.Now()
	// UTC時間
	curUTCTime := time.Now().UTC()
	fmt.Println(curLocalTime, curUTCTime)
}
複製代碼

設置時區

func setTimeZone() {
	curLocalTime := time.Now()
	curUtcTime := curLocalTime.In(time.UTC)
	fmt.Println(curUtcTime)
}
複製代碼

時間類型轉字符串: Format函數

func time2TimeStr() {
	localTimeStr := time.Now().Format("2006-01-02 15:04:05")
	// UTC時間
	utcTimeStr := time.Now().UTC().Format("2006-01-02 15:04:05")
	fmt.Println(localTimeStr, utcTimeStr)
}
複製代碼

時間類型轉時間戳: Unix函數

func getCurTimeStamp() {
	// 時間戳,精確到秒
	timestamp := time.Now().Unix()
	// 時間戳,精確到納秒
	timestampNano := time.Now().UnixNano()
	fmt.Println(timestamp, timestampNano)
}

複製代碼

時間戳轉時間類型:Unix函數

func timestamp2Time() {
	timestamp := time.Now().Unix()
	localTimeObj := time.Unix(timestamp, 0)
	fmt.Println(localTimeObj)
}
複製代碼

時間字符串轉時間類型:parse函數

func timeStr2Time() {
	timeStr := "2020-01-13 22:32:17"
	// 返回的是UTC時間 2020-01-13 22:32:17 +0000 UTC
	utcTimeObj, err := time.Parse("2006-01-02 15:04:05", timeStr)
	if err == nil {
		fmt.Println(utcTimeObj, utcTimeObj.Unix())
	}

	// 返回的是當地時間 2020-01-13 22:32:17 +0800 CST
	localTimeObj, err := time.ParseInLocation("2006-01-02 15:04:05", timeStr, time.Local)
	if err == nil {
		fmt.Println(localTimeObj)
	}
}
複製代碼

時間字符串轉時間戳:

parse函數 + Unix函數函數

時間戳轉字符串:

Unix函數 + Format函數spa

時間加減

注:(轉換爲Time類型比較容易作加減)線程

func addTime() {
	curTime := time.Now()
	// 加1秒
	addSecondTime := curTime.Add(time.Second * 1)
	// 加1分鐘
	addMinuteTime := curTime.Add(time.Minute * 1)
	addMinuteTime2 := curTime.Add(time.Second * time.Duration(60*1))
	fmt.Println(addSecondTime, addMinuteTime, addMinuteTime2)
}
複製代碼

注:這部分摘抄自想入飛飛的《Golang週期任務、定時任務》: www.jianshu.com/p/4955e5d65…code

週期任務:每隔5秒

func intervalTask() {
	ticker := time.NewTicker(time.Second * 5)
	go func() {
		for _ = range ticker.C {
			fmt.Println("do the thing")
		}
	}()

	time.Sleep(time.Minute)
}

複製代碼

倒計時任務:主線程阻塞

func countDownSyncTask() {
	timer1 := time.NewTimer(time.Second * 5)
	<-timer1.C
	fmt.Println("do the thing")
}
複製代碼

倒計時任務:主線程不阻塞

func countDownAsyncTask() {
	timer1 := time.NewTimer(time.Second * 3)

	go func() {
		//等觸發時的信號
		<-timer1.C
		fmt.Println("do the thing")
	}()
	//因爲上面的等待信號是在新線程中,因此代碼會繼續往下執行,停掉計時器
	time.Sleep(time.Second * 10)
}
複製代碼

定時任務,天天10:00:00觸發

func scheduleTask() {
	go func() {
		for {
			fmt.Println("觸發的事件")
			now := time.Now()
			// 計算下一個零點
			next := now.Add(time.Hour * 24)
			next = time.Date(next.Year(), next.Month(), next.Day(), 10, 0, 0, 0, next.Location())
			fmt.Println(next.Sub(now))
			t := time.NewTimer(next.Sub(now))
			<-t.C
		}
	}()
	time.Sleep(time.Hour * 24)
}
複製代碼
相關文章
相關標籤/搜索