1. 程式人生 > >Go_20: Golang 中 time 包的使用

Go_20: Golang 中 time 包的使用

舉例 處理程序 計算表達式 時間格式化 停止 out str div ati

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必須大於0
func (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 中已滿,以後便不會再執行對應的函數.

Go_20: Golang 中 time 包的使用