Go time包

time包

   time包提供了時間顯示與測量所使用的函數。

時間類型

   time.Time類型表示時間,使用time.now()函數獲取當前時間對象。對當前時間使用以下函數可獲取不同的時間欄位。

方法 描述
Year() 獲取年
Month() 獲取月
Day() 獲取日
Hour() 獲取時
Second() 獲取秒

   操作如下所示:

package main

import (
	"fmt"
	"time"
)

func main(){
	currentTime := time.Now()
	fmt.Println(currentTime)  // 2020-10-09 13:47:55.654372 +0800 CST m=+0.002998001
	fmt.Println(currentTime.Year())
	fmt.Println(currentTime.Month())
	fmt.Println(currentTime.Day())
	fmt.Println(currentTime.Hour())
	fmt.Println(currentTime.Minute())
	fmt.Println(currentTime.Second())
}

時間戳

   獲取時間戳共有兩種方法

方法 描述
Unix() 獲取時間戳
UnixNano() 獲取納秒級的時間戳

   操作如下所示:

package main

import (
	"fmt"
	"time"
)

func main(){
	currentTime := time.Now() 
	timestamp1 := currentTime.Unix()
	timestamp2 := currentTime.UnixNano()
	fmt.Println(timestamp1)
	fmt.Println(timestamp2)
}

時間轉換

時間戳轉日期

   使用Unix()方法可將時間戳轉為日期。

   如下所示:

package main

import (
	"fmt"
	"time"
)

func main() {
	var timestamp1 int64 = 1602222762  // 時間類型是int64
	date := time.Unix(timestamp1, 0) // 最後放入一個0即可
	fmt.Println(date) // 2020-10-09 13:52:42 +0800 CST
}

日期轉字元串

   日期轉字元串使用Format()函數進行格式化。

   需要注意的是Go語言中格式化時間模板不是常見的Y-m-d H:M:S,而是使用Go的誕生時間2006年1月2號15點04分(記憶口訣為2006 1 2 3 4)。

Go中的日期格式 其他語言日期格式 描述
2006 Y 代表年
1 m 代表月
2 d 代表日
3 H 代表時
4 M 代表分
5 S 代表秒

   如果想格式化為12小時方式,需指定PM。

  

   如下,我們為當前時間進行轉換成字元串格式:

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime := time.Now()
	strTime := currentTime.Format("2006年1月2日 (3時-4分-5秒) PM")  // 加上PM為12小時制
	fmt.Println(strTime) // 2020年10月9日 (2時-23分-1秒) PM
}

字元串轉日期

   字元串轉日期需要先設定時區,其次使用ParseInLocation()函數進行轉換。

   如下所示:

package main

import (
	"fmt"
	"time"
)

func main() {
	strTime := "2010-12-03 12:0:0"
	// 設置時區
	loc, _ := time.LoadLocation("Asia/Shanghai")
	// 設置轉換,參數1:指定格式 ,參數2:轉換的字元串時間
	timeObj, _ := time.ParseInLocation("2006-1-2 3:4:5", strTime, loc) 
	fmt.Println(timeObj) // 2010-12-03 12:00:00 +0800 CST
}

時間操作

時間間隔

   time.Durationtime包定義的一個類型,它代表兩個時間點之間經過的時間,以納秒為單位。

   time.Duration表示一段時間間隔,可表示的最長時間段大約290年。

   time包中定義的時間間隔類型的常量如下:

const (
    Nanosecond  Duration = 1
    Microsecond          = 1000 * Nanosecond  
    Millisecond          = 1000 * Microsecond
    Second               = 1000 * Millisecond
    Minute               = 60 * Second  // 秒
    Hour                 = 60 * Minute // 小時
)

Add

   下列將展示求當前時間一天後的時間:

package main

import (
	"fmt"
	"time"
)

func main() {
	currentTime := time.Now()
	tomorrow := currentTime.Add(time.Hour * 24)
	fmt.Println(tomorrow)
}

Sub

   下列將展示兩個時間中的差值。

package main

import (
	"fmt"
	"time"
)

func main() {
	var timestamp1 int64 = 1502222762
	date := time.Unix(timestamp1, 0)   // 舊時間

	result := time.Now().Sub(date) // 當前時間減去舊時間
	fmt.Println(result) // 27778h25m19.987857s 
}

Equal

   判斷兩個時間是否相等,不用考慮時區的差異,因為內部已經做好了處理。

package main

import (
	"fmt"
	"time"
)

func main() {
	var timestamp1 int64 = 1502222762
	date := time.Unix(timestamp1, 0) // 舊時間

	result := time.Now().Equal(date) // 現在是否等於設置好的舊時間?
	fmt.Println(result) // false
}

Before

   判斷該時間是否在某一時間之前,返回布爾值。

package main

import (
	"time"
	"fmt"
)

func main() {
	oldTime := time.Unix(1502222762, 0)
	newTime := time.Unix(1692223444, 0)
	result := oldTime.Before(newTime) // 舊時間是不是在新時間之前?
	fmt.Println(result) // true
}

After

   判斷該時間是否在某一時間之後,返回布爾值。

package main

import (
	"time"
	"fmt"
)

func main() {
	oldTime := time.Unix(1502222762, 0)
	newTime := time.Unix(1692223444, 0)
	result := oldTime.After(newTime) // 舊時間是不是在新時間之後?
	fmt.Println(result) // false
}

定時器

   使用time.Tick()來設置一個定時器。

   如下所示,每隔三秒運行一次show()函數。

package main

import (
	"fmt"
	"time"
)

func show(count *int) {
	fmt.Printf("運行了,這是第%v次\n", *count)
	*count++
}

func main() {
	count := 1
	for range time.Tick(3 * time.Second) {
		show(&count)
	}

}

執行緒睡眠

   使用time.Sleep()來讓當前執行緒進行阻塞。

package main

import (
	"fmt"
	"time"
)


func main() {
	count := 1
	for {
		time.Sleep(3 * time.Second)
		fmt.Println("運行次數:", count)
		count++
	}
}

Tags: