1. 程式人生 > 實用技巧 >Go中Time包的使用

Go中Time包的使用

1.獲取當前時間

// 獲取當前時間,返回的是Time型別
t := time.Now()
fmt.Println(t)

2.獲取時間戳

1970-01-01開始經過的秒數。

// 獲取當前時間的時間戳 
s := time.Now().Unix()
// 獲取某個Time時間的時間戳。
// t是Time型別物件
s := t.Unix()

3.格式化時間

如何將Time型別轉換成我們想要的字串時間格式。

// 獲取當前時間
t := time.Now()
// 按指定格式,格式化時間
s := t.Format("2006-01-02 15:04:05")
fmt.Println(s)
// 返回年月日
year, month, day := t.Date()
// 返回是時分秒
hour,minute,sec := t.Clock()
// 返回星期幾,從0開始
weekday := t.Weekday()
// 可以轉換成整數
fmt.Println(int(weekday))

輸出:

2019-09-15 10:43:14

格式化時間主要通過Time物件的Format函式處理。

函式定義:

func (t Time) Format(layout string) string

只有一個引數layout,layout就是指定我們需要格式化時間的模版。

下面是Time包預定於的時間模版:

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
    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
    RFC3339     = "2006-01-02T15:04:05Z07:00"
    RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
)

使用例子:

t := time.Now()
// 使用預定義的時間模版time.RFC3339
fmt.Println(t.Format(time.RFC3339))

輸出:

2019-09-15T10:50:03+08:00

時間模版裡面的引數不能隨便書寫,建議大家根據上面預定義的時間模版,進行修改。

例子:

// 獲取當前時間
t := time.Now()
// 只需要格式化年月日
tpl1 := "2006-01-02"
fmt.Println(t.Format(tpl1))
// 只需要格式化輸出時間
tpl2 := "15:04:05"
fmt.Println(t.Format(tpl2))

4.時間戳和日期互轉

go的Time時間型別可以轉換成時間戳,也能轉換成字串日期型別,因此我們只要將時間戳或者日期時間(字串)轉換成Time型別,即可完成自由轉換。

4.1. 時間戳轉日期

// 將時間戳轉換成Time型別
// 第一個引數是時間戳(毫秒),第二個引數是納秒,設定0即可
t := time.Unix(1568516266,0)
// 將Time轉換成我們想要的日期格式。
s := t.Format("2006-01-02 15:04:05")
fmt.Println(s)

4.2. 日期轉時間戳

// 將日期轉換成Time型別
// 獲取本地時區,重要
loc, _ := time.LoadLocation("Local")
// 指定我們要解析的時間模版
l := "2006-01-02 15:04:05"
// 呼叫ParseInLocation函式,將日期格式轉換成Time型別
t, _ := time.ParseInLocation(l, "2019-09-15 10:57:46", loc)
	
// 將Time轉換成時間戳
s := t2.Unix()
fmt.Println(s)

5.時間計算

專案中經常需要計算時間的前一天、後一天、前一週、上一月。

Time型別常用的時間計算函式:

  • Add - 返回增加指定時間的Time
  • AddDate - 返回增加指定的年份、月份和天數的時間點Time
  • Sub - 返回兩個Time型別相減的時間間隔(Duration型別)

5.1. Add

函式定義:

func (t Time) Add(d Duration) Time

Add返回時間點t+d。

例子:

t := time.Now()
// 計算前一分鐘,當前時間加上負一分鐘
t1 := t.Add(-time.Minute)

5.2. AddDate

函式定義:

func (t Time) AddDate(years int, months int, days int) Time

AddDate返回增加了給出的年份、月份和天數的時間點Time。

例子:

t := time.Now()
// 計算前一天, 當前時間加上0年,0月,-1天
t1 := t.AddDate(0,0,-1)
// 計算上一個月時間,當前時間加上0年,-1月,0天
t1 := t.AddDate(0,-1,0)

5.3. Sub

函式定義:

func (t Time) Sub(u Time) Duration

返回一個時間段t-u。如果結果超出了Duration可以表示的最大值/最小值,將返回最大值/最小值。要獲取時間點t-d(d為Duration),可以使用t.Add(-d)。

例子:

t := time.Now()
// 計算前一天
t1 := t.AddDate(0,0,-1)
// 兩個時間相減
s := t.Sub(t1)
// 因為時間間隔使用的是Duration型別,我們可以將時間單位轉換成小時
h := int(s/time.Hour)
// 也可以換成成其他單位,只要除於指定的時間常量即可:
// - Second 秒
// - Minute 分鐘
// - Hour  小時
fmt.Println(h)

6. 時間比較

Time型別常用的時間比較函式如下:

  • Equal - 比較兩個時間是否相等
  • Before - 相當於小於比較
  • After - 相當於大於比較

例子:

t := time.Now()
// 計算前一天
t1 := t.AddDate(0,0,-1)
if t.Equal(t1) {
	fmt.Println("時間相等")
}
if t1.Before(t) {
	fmt.Println("時間t1 < t")
}
if t.After(t1) {