time
time包提供了時間和日歷的相關的函數與方法。
time.Now()函數可以獲取當前時間
go
func Now() Timego
now := time.Now()
fmt.Println(now)
//2022-11-17 10:00:18.6983438 +0800 CST m=+0.007095001其返回的數據類型是Time結構體,其含有非常多的時間操作的方法。
go
func (t *Time) nsec() int32 //納秒
func (t *Time) sec() int64 //秒
func (t *Time) unixSec() //返回 Unix時間格式的 秒
func (t *Time) addSec(d int64) //增加秒
func (t *Time) setLoc(loc *Location) //設置地區
func (t *Time) stripMono() //去掉時間的單調時鐘讀數
func (t Time) After(u Time) //判斷一個時間是否在它之後
func (t Time) Before(u Time) bool //判斷一個時間是否在它之前
func (t Time) Equal(u Time) bool //判斷兩個時間是否表示同一瞬間
func (t Time) Sub(u Time) Duration //求兩個時間的差值
func (t Time) Add(d Duration) Time //增加一段時間間隔時間單位
time包存放了基礎的時間單位常量
go
const (
minDuration Duration = -1 << 63
maxDuration Duration = 1<<63 - 1
)
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)它們的類型是time.Duration,最小的單位是納秒,最大的是小時。
格式化
時間類型可以格式化輸出,不過需要注意的是在 Go 中格式化模板不是常見的 yyyy-mm-dd 這類,而是以 Go 誕生時間為模板。Go 的誕生的時間是 2006 年 1 月 2 日下午 15 點 04 分。
例子
go
now := time.Now()24 小時格式化輸出
go
fmt.Println(now.Format("2006-01-02 15:04:05 Monday Jan"))
//2022-11-17 10:44:48 Thursday Nov只輸出日期
go
fmt.Println(now.Format("2006-01-02"))
//2022-11-17只輸入 12 小時制的時間
go
fmt.Println(now.Format("15:04:05 PM"))
//10:48:47 AM解析時間
通常我們會有一個需求就是,將一個字符串時間按照一定格式轉換為 Go 中的時間結構體,接下來我們要做的就是這件事。
go
func main() {
location, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println(err)
return
}
inLocation, err := time.ParseInLocation("2006/01/02", "2012/10/12", location)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(inLocation.String())
}最終輸出
2012-10-12 00:00:00 +0800 CSTTimer
Timer 是一個計時器,對外暴露一個 channel,當指定時間到了以後,channel 就會收到消息並關閉。
go
func NewTimer(d Duration) *Timer通過time.NewTimer()可以創建一個新的計時器
sh
func main() {
timer := time.NewTimer(time.Second)
defer timer.Stop()
select {
case t := <-timer.C:
fmt.Println(t)
}
}2023-09-25 21:25:03.5696803 +0800 CST m=+1.007908001在使用完 timer 以後,應及時的關閉。
Ticker
Ticker 是一個定時器,與 timer 的區別在於,timer 是一次性的,而 Ticker 是定時觸發。
go
func NewTicker(d Duration) *Ticker通過time.NewTicker()可以創建一個新的定時器
go
func main() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for i := 0; i < 3; i++ {
select {
case t := <-ticker.C:
fmt.Println(t)
}
}
}2023-09-25 21:29:20.4429256 +0800 CST m=+1.009508401
2023-09-25 21:29:21.4512075 +0800 CST m=+2.017790301
2023-09-25 21:29:22.4501592 +0800 CST m=+3.016742001同樣的,在使用完 ticker 後,也要及時關閉。
sleep
time.Sleep()可以使用當前 goroutine 處於掛起狀態一定的時間,在這期間 goroutine 將被阻塞,直到恢復運行狀態。
go
func Sleep(d Duration)sh
func main() {
start := time.Now()
fmt.Println(start)
time.Sleep(time.Second * 2)
end := time.Now()
fmt.Println(end)
}2023-09-25 21:36:35.7229057 +0800 CST m=+0.001627901
2023-09-25 21:36:37.7347742 +0800 CST m=+2.013496401上面這段程序就會在輸出完start後阻塞兩秒,然後再輸出end。
