Go_20: Golang 中 time 包的使用

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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 中已滿,以後便不會再執行對應的函數.

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.