golang標準庫time時間包的使用
time包
時間和日期是我們編程中經(jīng)常會用到的,本文主要介紹了 Go 語言內(nèi)置的 time 包的基本用法。
- time 包提供了一些關于時間顯示和測量用的函數(shù)。
- time 包中日歷的計算采用的是公歷,不考慮潤秒。
Go 語言中使用time.Time類型表示時間。我們可以通過time.Now函數(shù)獲取當前的時間對象,然后從時間對象中可以獲取到年、月、日、時、分、秒等信息。
// 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) }
跨時區(qū)
Go 語言中使用 location 來映射具體的時區(qū)。時區(qū)(Time Zone)是根據(jù)世界各國家與地區(qū)不同的經(jīng)度而劃分的時間定義,全球共分為24個時區(qū)。
中國差不多跨5個時區(qū)(壯哉我中國,地大物博),為了時區(qū)的一致,在國內(nèi)通常使用的是北京的時區(qū)。
下面的示例代碼中使用beijing來表示東八區(qū)8小時的偏移量,其中time.FixedZone和time.LoadLocation這兩個函數(shù)則是用來獲取location信息。
// timezoneDemo 時區(qū)示例 func timezoneDemo() { // 中國沒有夏令時,使用一個固定的8小時的UTC時差。 // 對于很多其他國家需要考慮夏令時。 secondsEastOfUTC := int((8 * time.Hour).Seconds()) // FixedZone 返回始終使用給定區(qū)域名稱和偏移量(UTC 以東秒)的 Location。 beijing := time.FixedZone("Beijing Time", secondsEastOfUTC) // 如果當前系統(tǒng)有時區(qū)數(shù)據(jù)庫,則可以加載一個位置得到對應的時區(qū) // 例如,加載紐約所在的時區(qū) 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() // 加載上海所在的時區(qū) //shanghai, err := time.LoadLocation("Asia/Shanghai") // UTC+08:00 // 加載東京所在的時區(qū) //tokyo, err := time.LoadLocation("Asia/Tokyo") // UTC+09:00 // 創(chuàng)建時間對象需要指定位置。常用的位置是 time.Local(當?shù)貢r間) 和 time.UTC(UTC時間)。 //timeInLocal := time.Date(2023, 10, 27, 20, 0, 0, 0, time.Local) // 系統(tǒng)本地時間 timeInUTC := time.Date(2023, 10, 27, 12, 0, 0, 0, time.UTC) sameTimeInBeijing := time.Date(2023, 10, 27, 20, 0, 0, beijing) sameTimeInNewYork := time.Date(2009, 1, 1, 7, 0, 0, 0, newYork) // 北京時間(東八區(qū))比UTC早8小時,所以上面兩個時間看似差了8小時,但表示的是同一個時間 timesAreEqual := timeInUTC.Equal(sameTimeInBeijing) fmt.Println(timesAreEqual) // 紐約(西五區(qū))比UTC晚5小時,所以上面兩個時間看似差了5小時,但表示的是同一個時間 timesAreEqual = timeInUTC.Equal(sameTimeInNewYork) fmt.Println(timesAreEqual) }
注意
由于time.loadLocation 依賴系統(tǒng)的時區(qū)數(shù)據(jù)庫,在不確定程序的運行環(huán)境的情況下建議先定義時區(qū)偏移量,然后使用time.FixedZone 的方式指定時區(qū)。
(這個我遇到過,你們敢信,在這個時代,我曾經(jīng)遇到過一個xp系統(tǒng)的電腦。人還不會配置時間,系統(tǒng)時間就有問題。所以一定不能依賴系統(tǒng)的時區(qū)數(shù)據(jù)庫)
時間戳
Unix Time是自1970年1月1日 00:00:00 UTC 至當前時間經(jīng)過的總秒數(shù)。
// timestampDemo 時間戳 func timestampDemo() { now := time.Now() // 獲取當前時間 timestamp := now.Unix() // 秒級時間戳 milli := now.UnixMilli() // 毫秒時間戳 Go1.17+ micro := now.UnixMicro() // 微秒時間戳 Go1.17+ nano := now.UnixNano() // 納秒時間戳 fmt.Println(timestamp, milli, micro, nano) }
time 包還提供了一系列將 int64 類型的時間戳轉換為時間對象的方法。
這里注意還是得轉換一下時區(qū)
secondsEastOfUTC := int((8 * time.Hour).Seconds()) beijing := time.FixedZone("Beijing Time", secondsEastOfUTC) // 北京時間 2022-02-22 22:22:22.000000022 +0800 CST t := time.Date(2022, 02, 22, 22, 22, 22, 22, beijing) var ( sec = t.Unix() msec = t.UnixMilli() usec = t.UnixMicro() ) // 將秒級時間戳轉為時間對象(第二個參數(shù)為不足1秒的納秒數(shù)) timeObj := time.Unix(sec, 22) fmt.Println(timeObj) // 2022-02-22 22:22:22.000000022 +0800 CST timeObj = time.UnixMilli(msec) // 毫秒級時間戳轉為時間對象 fmt.Println(timeObj) // 2022-02-22 22:22:22 +0800 CST timeObj = time.UnixMicro(usec) // 微秒級時間戳轉為時間對象 fmt.Println(timeObj) // 2022-02-22 22:22:22 +0800 CST
時間間隔
time.Duration是time包定義的一個類型,它代表兩個時間點之間經(jīng)過的時間,以納秒為單位。
time.Duration表示一段時間間隔,可表示的最長時間段大約290年。
time.Duration表示1納秒,time.Second表示1秒。
const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
源碼
時間操作
add
func (t Time) Add(d Duration) Time
func main() { now := time.Now() later := now.Add(time.Hour) // 當前時間加1小時后的時間 fmt.Println(later) }
Sub
func (t Time) Sub(u Time) Duration
返回一個時間段t-u。
如果結果超出了Duration可以表示的最大值
或最小值
,將返回最大值
或最小值
。
要獲取時間點t-d(d為Duration),可以使用t.Add(-d)。
Equal
func (t Time) Equal(u Time) bool
判斷兩個時間是否相同,會考慮時區(qū)的影響,因此不同時區(qū)標準的時間也可以正確比較。
這個方法和用t==u不同,這種方法還會比較地點和時區(qū)信息。
Before
func (t Time) Before(u Time) bool
如果t代表的時間點在u之前,返回真;否則返回假。
After
func (t Time) After(u Time) bool
如果t代表的時間點在u之后,返回真;否則返回假。
定時器
使用time.Tick(時間間隔)來設置定時器,定時器的本質上是一個通道(channel)
func tickDemo() { ticker := time.Tick(time.Second) //定義一個1秒間隔的定時器 for i := range ticker { fmt.Println(i)//每秒都會執(zhí)行的任務 } }
時間格式化
time.Format函數(shù)能夠將一個時間對象格式化輸出為指定布局的文本表示形式,需要注意的是 Go 語言中時間格式化的布局不是常見的Y-m-d H:M:S
,而是使用2023-10-27 15:04:05.000
- 如果想格式化為12小時格式,需在格式化布局中添加PM。
- 小數(shù)部分想保留指定位數(shù)就寫0,如果想省略末尾可能的0就寫 9。
// 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")) // 小數(shù)點后寫0,因為有3個0所以格式化輸出的結果也保留3位小數(shù) fmt.Println(now.Format("2006/01/02 15:04:05.000")) // 2022/02/27 00:10:42.960 // 小數(shù)點后寫9,會省略末尾可能出現(xiàn)的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兩個函數(shù)。
其中time.Parse在解析時不需要額外指定時區(qū)信息。
// parseDemo 指定時區(qū)解析時間 func parseDemo() { // 在沒有時區(qū)指示符的情況下,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 // 在有時區(qū)指示符的情況下,time.Parse 返回對應時區(qū)的時間表示 // RFC3339 = "2006-01-02T15:04:05Z07:00" timeObj, err = time.Parse(time.RFC3339, "2023-10-05T11:25:20+08:00") if err != nil { fmt.Println(err) return } fmt.Println(timeObj) // 2022-10-05 11:25:20 +0800 CST }
time.ParseInLocation函數(shù)需要在解析時額外指定時區(qū)信息。
func parseDemo() { now := time.Now() fmt.Println(now) // 加載時區(qū) loc, err := time.LoadLocation("Asia/Shanghai") if err != nil { fmt.Println(err) return } // 按照指定時區(qū)和指定格式解析字符串時間 timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2022/10/05 11:25:20", loc) if err != nil { fmt.Println(err) return } fmt.Println(timeObj) fmt.Println(timeObj.Sub(now)) }
到此這篇關于golang標準庫time時間包的使用的文章就介紹到這了,更多相關golang time標準庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Golang中的Slice與數(shù)組及區(qū)別詳解
數(shù)組是一種具有固定長度的基本數(shù)據(jù)結構,在golang中與C語言一樣數(shù)組一旦創(chuàng)建了它的長度就不允許改變,數(shù)組的空余位置用0填補,不允許數(shù)組越界。今天小編通過實例代碼操作給大家詳細介紹lang中的Slice與數(shù)組的相關知識,一起看看吧2020-02-02使用Golang?Validator包實現(xiàn)數(shù)據(jù)驗證詳解
在開發(fā)過程中,數(shù)據(jù)驗證是一個非常重要的環(huán)節(jié),而golang中的Validator包是一個非常常用和強大的數(shù)據(jù)驗證工具,提供了簡單易用的API和豐富的驗證規(guī)則,下面我們就來看看Validator包的具體使用吧2023-12-12go語言實現(xiàn)字符串與其它類型轉換(strconv包)
strconv包是Go語言標準庫的一部分,主要提供字符串與基本數(shù)據(jù)類型之間的轉換功能,使用strconv包可以方便地在不同類型之間進行轉換,滿足日常編程中的需求,感興趣的可以了解一下2024-10-10Go 簡單實現(xiàn)多租戶數(shù)據(jù)庫隔離
本文主要介紹了Go 簡單實現(xiàn)多租戶數(shù)據(jù)庫隔離,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05