1. 程式人生 > >Go語言中Time的用法[2]

Go語言中Time的用法[2]

Date函式:

定義:func Date(yearint, month Month, day, hour, min, sec, nsec int, loc *Location) Time

函式基於給定的Location返回一個“yyyy-mm-ddhh:mm:ss + nsec nanoseconds”形式的Time物件,month, day, hour, min, sec,和nsec這些引數可以超出正常的取值範圍,例如1月32日會轉化為2月1日。

示例:

t := time.Date(2017, time.February, 16, 12, 0, 0, 0, time.Local)

fmt.Println(t)

輸出:

2017-02-16 12:00:00 +0800 CST

Now函式:

定義:func Now() Time

Now函式返回當前本地時間

Parse函式:

定義:funcParse(layout, value string) (Time, error)

Parse函式根據layout指定的格式將string解析為Time型別並返回。layout格式與Format函式的使用類似,也可以使用time中定義的格式常量。string中並不一定要包含Time所有的屬性(年月日時分秒…),任何省略掉的屬性都預設賦為0。若不指定,預設解析得到的Time時區為UTC。

示例:

const longForm = "Jan 2, 2006 at 3:04pm (MST)"

t, _ := time.Parse(longForm, "Feb 3, 2013 at 7:54pm (PST)")

fmt.Println(t)

const shortForm = "2006-Jan-02"

t, _ = time.Parse(shortForm, "2013-Feb-03")

fmt.Println(t)

輸出:

2013-02-03 19:54:00 +0000 PST

2013-02-03 00:00:00 +0000 UTC

ParseInLocation函式:

定義:funcParseInLocation(layout, value string, loc *Location) (Time, error)

與Parse方法類似,但是會按照loc引數指定的時區進行解析

Weekday型別:

常量定義:

type Weekday int

const (

Sunday Weekday = iota

Monday

Tuesday

Wednesday

Thursday

Friday

Saturday

)

Weekday的String方法:

定義:func (d Weekday)String() string

返回例如“Sunday”,“Monday”的字串

計算類方法:

Time的Add方法:

定義:func (t Time) Add(d Duration) Time

返回t+d

Time的Sub方法:

定義:func (t Time) Sub(u Time) Duration

返回time.Duration(t-u)

Time的AddDate方法:

定義:func (t Time) AddDate(years int, months int, days int) Time

在引數t的基礎上加上years,months,days指定的值(可以是負值),和Date方法一樣,當計算結果超出正常範圍時,會換算(進位/借位)。

比較類方法:

Time的After方法:

定義:func (t Time) After(u Time) bool

判斷t對應的時間是否晚於u

Time的Before方法:

定義:func (t Time) Before(u Time) bool

判斷t對應的時間是否早於u

Time的Equal方法:

定義:func (t Time) Equal(u Time) bool

該方法判斷t和u所代表的時間是否相等,即使兩個不同時區的時間也有可能返回true,例如6:00 +0200 CEST和4:00 UTC就是相同的時間。該方法與t == u不同,==除了比較時間本身,還要比較兩個時間的時區。

Time的IsZero方法:

定義:func (t Time) IsZero() bool

判斷t是否為基準時間January 1, year 1, 00:00:00 UTC

獲取屬性:

Time的Clock方法:

定義:func (t Time) Clock() (hour, min, sec int)

返回t的hour,min,sec屬性

Time的Date方法:

定義:func (t Time) Date() (year int, month Month, day int)

返回t的year,month,day屬性

Time的YearDay方法:

定義:func (t Time) YearDay() int

返回t是當年的第幾天,平年的取值範圍是[1,365],閏年是[1,366]

Time的Year方法:

定義:func (t Time) Year() int

返回t的year屬性

Time的Month方法:

定義:func (t Time) Month() Month

返回t的month屬性

Time的Weekday方法:

定義:func (t Time) Weekday() Weekday

返回t對應的日期是星期幾

Time的Day方法:

定義:func (t Time) Day() int

返回t的day屬性

Time的Hour方法:

定義:func (t Time) Hour() int

返回t的hour屬性,取值範圍:[0, 23]

Time的Minute方法:

定義:func (t Time) Minute() int

回t的minute屬性,取值範圍:[0, 59]

Time的Second方法:

定義:func (t Time) Second() int

回t的second屬性,取值範圍:[0, 59]

Time的Nanosecond方法:

定義:func (t Time) Nanosecond() int

回t的nanosecond屬性,取值範圍:[0, 999999999]

Time的Location方法:

定義:func (t Time) Location() *Location

獲取t的時區

Time的Zone方法:

定義:func (t Time) Zone() (name string, offset int)

返回t對應的時區名稱以及相對UTC的偏移值(秒)

時區轉換:

Time的Local方法:

定義:func (t Time) Local() Time

將t轉換為本地時間

Time的In方法:

定義:func (t Time) In(loc *Location) Time

將t轉換到loc對應的時區

Time的UTC方法:

定義:func (t Time) UTC() Time

將t轉換為UTC時間

Time的Round方法:

定義:func (t Time)Round(d Duration) Time

該方法為近似方法,用於將t根據給定的Duration取整(取到離其最近的整數倍),滿足四捨五入。

示例:

t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)

round := []time.Duration{ time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, 2 * time.Second, time.Minute, 10 * time.Minute, time.Hour, }

for _, d := range round {

fmt.Printf("t.Round(%6s) = %s\n", d, t.Round(d).Format("15:04:05.999999999"))

}

輸出:

t.Round(1ns) = 12:15:30.918273645

t.Round(1µs) = 12:15:30.918274

t.Round(1ms) = 12:15:30.918

t.Round(1s) = 12:15:31

t.Round(2s) = 12:15:30

t.Round(1m0s) = 12:16:00

t.Round( 10m0s) = 12:20:00

t.Round(1h0m0s) = 12:00:00

Time的Truncate方法:

定義:func (t Time)Truncate(d Duration) Time

與Round方法類似,區別是Truncate是“下取整”

示例:

t := time.Date(0, 0, 0, 12, 15, 30, 918273645, time.UTC)

trunc := []time.Duration{ time.Nanosecond, time.Microsecond, time.Millisecond, time.Second, 2 * time.Second, time.Minute, 10 * time.Minute, time.Hour, }

for _, d := range trunc {

fmt.Printf("t.Truncate(%6s) = %s\n", d, t.Truncate(d).Format("15:04:05.999999999"))

}

輸出:

t.Truncate(1ns) = 12:15:30.918273645

t.Truncate(1µs) = 12:15:30.918273

t.Truncate(1ms) = 12:15:30.918

t.Truncate(1s) = 12:15:30

t.Truncate(2s) = 12:15:30

t.Truncate(1m0s) = 12:15:00

t.Truncate( 10m0s) = 12:10:00

t.Truncate(1h0m0s) = 12:00:00

Time的String方法:

定義:func (t Time)String() string

返回格式如"2006-01-0215:04:05.999999999 -0700 MST"的t

Time的Format方法:

定義:func (t Time)Format(layout string) string

按照layout中定義的格式將Time轉換為string

Timer型別:

Timer型別代表一個事件,當Timer的預設時間到了之後,會向對應的channel中傳送當前時間,使用AfterFunc函式建立的Timer除外。需要使用NewTimer或AfterFunc函式建立Timer。

Timer定義:

type Timer struct {

C <-chan Time

// contains filtered or unexported fields

}

AfterFunc函式:

定義:func AfterFunc(dDuration, f func()) *Timer

該函式等待d限定的時間後,在自身goroutine中執行方法f,返回一個Timer指標,該指標可以呼叫Stop來停止Timer,從而不觸發f函式

示例:

t := time.AfterFunc(time.Second * 10, func () { fmt.Println("test") })

time.Sleep(time.Second * 5)

if t.Stop() {

fmt.Println("Timer stopped")

}

輸出:

Timer stopped

NewTimer函式:

定義:func NewTimer(dDuration) *Timer

建立一個Timer,當等待d限定的時間後,會向Timer對應的channel中傳送一個當前時間的Time物件

Timer的Reset方法:

定義:func (t *Timer)Reset(d Duration) bool

將t的Duration修改為d,如果t已經過期了或者被Stop了,則返回false,如果t是active的,則返回true,Reset一個Timer之前,務必使用Stop檢測其狀態:

if !t.Stop() {

<-t.C

}

t.Reset(d)

Timer的Stop方法:

定義:func (t *Timer)Stop() bool

停止Timer,如果t已經過期了或者被Stop了,則返回false,如果t是active的,則返回true,Stop不會關閉Timer的channel,關閉後,檢查返回值,如果未能成功關閉,將Timer的channel中的Time物件取出:

if !t.Stop() {

<-t.C

}

Timer的一個例子:

t := time.NewTimer(time.Second * 5)

t1 := time.NewTimer(time.Second * 20)

c := make(chan int)

go func() {

for i := 0; i < 17; i++{

c <- i;

time.Sleep(time.Second * 1)

}

} ()

for {

select {

case x := <- c:

fmt.Println(x, "received")

case <- t.C:

fmt.Println("Timer fired")

t.Reset(time.Second * 5)

case <- t1.C:

fmt.Println("Exit")

t.Stop()

t1.Stop()

return

}

}

輸出:

0 received

1 received

2 received

3 received

4 received

Timer fired

5 received

6 received

7 received

8 received

9 received

Timer fired

10 received

11 received

12 received

13 received

14 received

Timer fired

15 received

16 received

Exit