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 |