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.Duration
是time
包定義的一個類型,它代表兩個時間點之間經過的時間,以納秒為單位。
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++
}
}