go時間、定時器與休眠函式(time包)
time包提供了時間顯示和測量相關的函式。包括時間處理與定時器處理(Timer、Ticker、Sleep等)
格式化
go語音中時間格式化非常特別,可簡記為‘123456’(月日時分秒年:"2006-01-02 15:04:05.999999999 -0700 MST",15表示24小時制,3表示12小時制(會帶AM或PM))
如:time.Now().Format("2006-01-02 15:04:05")
預定義格式:
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDat = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
時間操作
-
獲取時間
-
Now() // 當前本地時間
-
Unix(sec int64, nsec int64) // 根據時間戳返回本地時間
-
Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) // 返回指定時間
-
-
轉換與格式化
-
UTC() // 獲取指定時間在UTC 時區的時間表示
-
Local() // 以本地時區表示
-
In(loc *Location) // 時間在指定時區的表示
-
Format(layout string) // 按指定格式顯示時間
-
-
比較與計算
-
IsZero() bool {} // 是否是零時時間
-
After(u Time) bool {} // 時間在u之前
-
Before(u Time) bool {} // 時間在u之後
-
Equal(u Time) bool {} // 時間與u相同
-
Add(d Duration) Time {} // 返回t +d 的時間點
-
Sub(u Time) Duration {} // 返回 t-u
-
AddDate(years int, months int, days int) Time {} // 返回增加後的時間點
-
定時器
定時器(Ticker會重複,Timer只執行一次;不需要時都可通過Stop來停止,但若返回的是chan則就無法停止)
-
timer
-
AfterFunc(d Duration, f func()) *Timer:過指定時間後執行f;
-
NewTimer(d Duration) *Timer:可通過reset 重新開始;
-
After(d Duration) <-chan Time:指定時間後觸發(若放在select中,則每次重新select都重新計時);
-
-
ticker
-
NewTicker(d Duration) *Ticker:返回一個只讀的channel,定時觸發一次,不用時呼叫Stop停止;
-
Tick(d Duration) <-chan Time:對NewTicker的封裝(直接返回了NewTicker.C,可直接讀取,但無法停止定時器了);
-
type Ticker struct {
C <-chan Time //週期性傳遞時間資訊的通道
r runtimeTimer // 定時器相關資訊(開始時間、週期、回撥、引數等)
}
ticker := time.NewTicker(5 * time.Second)
// for _ = range ticker.C {
// fmt.Println(time.Now())
// }
for {
select{
case <- ticker.C: ...
case <- time.After(10*time.Second): ... #永遠沒機會執行(每5秒會重新開始)
}
}
-
Sleep(d Duration):休眠指定時間
時間相關型別
時間處理相關的主要資料型別有:time.Time, time.Month, time.Weekday, time.Duration, time.Location等。
-
time.Time精確到納秒的時間點
type Time struct {
sec int64 // 從1年1月1日 00:00:00 UTC 至今過去的秒數
nsec int32 // 最近一秒到下一秒過去的納秒數
loc *Location // 時區
}
-
time.Month一年中的某個月
type Month int
const (
January Month = 1 + iota
February
March
April
May
June
July
August
September
October
November
December
)
-
time.Weekday一週的周幾
type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
-
time.Duration 兩個時間點之間經過的納秒數
可表示的最長時間段約為290年
type Duration int64
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
-
Location一個地點及所在的時區資訊
北京時間可以使用 Asia/Shanghai
type Location struct {
name string
zone []zone
tx []zoneTrans
cacheStart int64
cacheEnd int64
cacheZone *zone
}