這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
time包中包括兩類時間:時間點(某一時刻)和時常(某一段時間)
1. 時間常量(時間格式化)
const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "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" 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")
這些常量是在time包中進行 time 格式化 和 time 解析而預定義的一些常量,其實他們使用的都是一個特定的時間:
Mon Jan 2 15:04:05 MST 2006
這個時間是 Unix time 1136239445,因為MST是 GMT-0700,所以這個指定的時間也可以看做
01/02 03:04:05PM '06 -0700
可見程式猿也有調皮的一面.
因此我們只需要利用上面這些時間變可以隨意的指定自己的時間格式,例如:
layout := "01__02-2006 3.04.05 PM"fmt.Println(time.Now().Format(layout))
便會輸出類似的時間:11__26-2014 8.40.00 PM
2. 函數
1. time 組成
time.Duration(時間長度,消耗時間)time.Time(時間點)time.C(放時間的channel通道)(註:Time.C:=make(chan time.Time))
2. After 函數
func After(d Duration) <-chan Time表示多少時間之後,但是在取出channel內容之前不阻塞,後續程式可以繼續執行func Sleep(d Duration)表示休眠多少時間,休眠時處於阻塞狀態,後續程式無法執行.
舉例說明二者區別:
fmt.Println("hello")chan := time.After(time.Secone*1)fmt.Println("World")
fmt.Println("hello")chan := time.Sleep(time.Secone*1)fmt.Println("World")
第一個程式在執行完輸出 hello 後,接著便輸出 world,不用等待 1s,但是 1s 後,chan 中有資料,則會列印出來;
第二個程式 chan 阻塞,則在輸出 hello 後,程式變休眠 1s 中,然後才輸出 World.
由此可見阻塞和非阻塞便是這兩個函數的本質區別.
鑒於After特性,其通常用來處理常式逾時問題,如下所示:
select {case m := <-c: handle(m)case <-time.After(5 * time.Minute): fmt.Println("timed out")}
3. 重複執行的函數
func Tick(d Duration) <-chan Time
time.Tick(time.Duration) 用法和 time.After 差不多,但是它是表示每隔多少時間之後,是一個重複的過程,其他與 After 一致
type Ticker //主要用來按照指定的時間周期來調用函數或者計算運算式,通常的使用方式是利用go新開一個協程使用,它是一個斷續器func NewTicker(d Duration) *Ticker //新產生一個ticker,此Ticker包含一個channel,此channel以給定的duration發送時間。duration d必須大於0func (t *Ticker) Stop() //用於關閉相應的Ticker,但並不關閉channel
使用時間控制停止ticker
ticker := time.NewTicker(time.Millisecond * 500)go func() { for t := range ticker.C { fmt.Println("Tick at", t) }}()time.Sleep(time.Millisecond * 1500) //阻塞,則執行次數為sleep的休眠時間/ticker的時間ticker.Stop() fmt.Println("Ticker stopped")
使用channel控制停止ticker
ticker := time.NewTicker(time.Millisecond * 500)c := make(chan int,num) //num為指定的執行次數go func() {for t := range ticker.C { c<-1 fmt.Println("Tick at", t)}}()ticker.Stop()
這種情況下,在執行 num 次以 Ticker 時間為單位的函數之後,c channel 中已滿,以後便不會再執行對應的函數.