go語言中time包的各種函數總結
前言
在我們開發的過程中,每個項目都需要時間這一類的函數,此時,對time這個包的研究深度就顯得尤為重要,現在,對time包中的各種函數做出一個總結,加深一些記憶,
時間類型
Go語言中,time.Time類型表示時間。我們可以通過time.Now函數獲取當前時間的對象,然後從時間對象中獲取到年,月,日,時,分,秒等信息,代碼如下
// timeDemo 時間對象的年月日時分秒 func timeDemo() { now := time.Now() // 獲取當前時間 fmt.Printf("current time:%v\n", now) year := now.Year() // 年 month := now.Month() // 月 day := now.Day() // 日 hour := now.Hour() // 小時 minute := now.Minute() // 分鐘 second := now.Second() // 秒 fmt.Println(year, month, day, hour, minute, second) }
Location和time zone
Go 語言中使用 location 來映射具體的時區。時區(Time Zone)是根據世界各國傢與地區不同的經度而劃分的時間定義,全球共分為24個時區。中國差不多跨5個時區,但為瞭使用方便隻用東八時區的標準時即北京時間為準。
下面的示例代碼中使用beijing來表示東八區8小時的偏移量,其中time.FixedZone和time.LoadLocation`這兩個函數則是用來獲取location信息。
// timezoneDemo 時區示例 func timezoneDemo() { // 中國沒有夏令時,使用一個固定的8小時的UTC時差。 // 對於很多其他國傢需要考慮夏令時。 secondsEastOfUTC := int((8 * time.Hour).Seconds()) // FixedZone 返回始終使用給定區域名稱和偏移量(UTC 以東秒)的 Location。 beijing := time.FixedZone("Beijing Time", secondsEastOfUTC) // 如果當前系統有時區數據庫,則可以加載一個位置得到對應的時區 // 例如,加載紐約所在的時區 newYork, err := time.LoadLocation("America/New_York") // UTC-05:00 if err != nil { fmt.Println("load America/New_York location failed", err) return } fmt.Println() // 加載上海所在的時區 //shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00 // 加載東京所在的時區 //tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00 // 創建時間對象需要指定位置。常用的位置是 time.Local(當地時間) 和 time.UTC(UTC時間)。 //timeInLocal := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local) // 系統本地時間 timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC) sameTimeInBeijing := time.Date(2009, 1, 1, 20, 0, 0, 0, beijing) sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork) // 北京時間(東八區)比UTC早8小時,所以上面兩個時間看似差瞭8小時,但表示的是同一個時間 timesAreEqual := timeInUTC.Equal(sameTimeInBeijing) fmt.Println(timesAreEqual) // 紐約(西五區)比UTC晚5小時,所以上面兩個時間看似差瞭5小時,但表示的是同一個時間 timesAreEqual = timeInUTC.Equal(sameTimeInNewYork) fmt.Println(timesAreEqual) }
時間間隔
time.Duration是time包定義的一個類型,它代表兩個時間點之間經過的時間,以納秒為單位。time.Duration表示一段時間間隔,可表示的最長時間段大約290年。
Add
func main() { now := time.Now() later := now.Add(time.Hour) // 當前時間加1小時後的時間 fmt.Println(later) }
sub
返回一個時間段t-u。如果結果超出瞭Duration可以表示的最大值/最小值,將返回最大值/最小值。要獲取時間點t-d(d為Duration),可以使用t.Add(-d)。
func (t Time) Sub(u Time) Duration
Before
如果t代表的時間點在u之前,返回真;否則返回假
func (t Time) Before(u Time) bool
After
如果t代表的時間點在u之後,返回真;否則返回假。
func (t Time) After(u Time) bool
定時器
使用time.Tick(時間間隔)來設置定時器,定時器的本質上是一個通道(channel)。
unc tickDemo() { ticker := time.Tick(time.Second) //定義一個1秒間隔的定時器 for i := range ticker { fmt.Println(i)//每秒都會執行的任務 } }
時間格式化
time.Format函數能夠將一個時間對象格式化輸出為指定佈局的文本表示形式,需要註意的是 Go 語言中時間格式化的佈局不是常見的Y-m-d H:M:S,而是使用 2006-01-02 15:04:05.000(記憶口訣為2006 1 2 3 4 5)。
其中:
2006:年(Y)
01:月(m)
02:日(d)
15:時(H)
04:分(M)
05:秒(S)`
// formatDemo 時間格式化 func formatDemo() { now := time.Now() // 格式化的模板為 2006-01-02 15:04:05 // 24小時制 fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan")) // 12小時制 fmt.Println(now.Format("2006-01-02 03:04:05.000 PM Mon Jan")) // 小數點後寫0,因為有3個0所以格式化輸出的結果也保留3位小數 fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960 // 小數點後寫9,會省略末尾可能出現的0 fmt.Println(now.Format("2006/01/02 15:04:05.999")) // 2022/02/27 00:10:42.96 // 隻格式化時分秒部分 fmt.Println(now.Format("15:04:05")) // 隻格式化日期部分 fmt.Println(now.Format("2006.01.02")) }
時間格式化的時間
對於從文本的時間表示中解析出時間對象,time包中提供瞭time.Parse和time.ParseInLocation兩個函數。
其中time.Parse在解析時不需要額外指定時區信息。
// parseDemo 指定時區解析時間 func parseDemo() { // 在沒有時區指示符的情況下,time.Parse 返回UTC時間 timeObj, err := time.Parse("2006/01/02 15:04:05", "2022/10/05 11:25:20") if err != nil { fmt.Println(err) return } fmt.Println(timeObj) // 2022-10-05 11:25:20 +0000 UTC // 在有時區指示符的情況下,time.Parse 返回對應時區的時間表示 // RFC3339 = "2006-01-02T15:04:05Z07:00" timeObj, err = time.Parse(time.RFC3339, "2022-10-05T11:25:20+08:00") if err != nil { fmt.Println(err) return } fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST
總結
到此這篇關於go語言中time包的各種函數總結的文章就介紹到這瞭,更多相關go語言time包內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 一篇文章帶你搞懂Go語言標準庫Time
- 一文帶你瞭解Go語言中time包的時間常用操作
- Go time包AddDate使用解惑實例詳解
- Go中time.RFC3339 時間格式化的實現
- C++超詳細講解構造函數