Go時間操作常用方法(推薦!)
1. time 包
1.1. 時間類型
Go 語言中時間類型有兩種:
- time.Time:表示時間的類型,常見的有兩種方式:
- time.Now():獲取當(dāng)前的時間
- time.Date():根據(jù)指定的年、月、日、時、分、秒、納秒等創(chuàng)建時間
- time.Duration:表示兩個時間點(diǎn)之間經(jīng)過的時間,以納秒為單位
1.2. 時間戳
時間戳是自 1970 年 1 月 1 日(08:00:00GMT)至當(dāng)前時間的總毫秒數(shù)。它也被稱為 Unix 時間戳(UnixTimestamp)。
1.3. 時間間隔
time.Duration 是 time 包定義的一個類型,它代表兩個時間點(diǎn)之間經(jīng)過的時間,以納秒為單位。time.Duration 表示一段時間間隔,可表示的最長時間段大約 290 年。
1.4. 時間操作
Go 語言中時間操作主要有兩種:
- 獲取時間:time.Now()、time.Date()
- 格式化時間:time.Format()、time.Parse()
2. 獲取時間
2.1. 獲取當(dāng)前時間
Go 語言中通過 time.Now()函數(shù)獲取當(dāng)前時間,返回一個 time.Time 類型的本地時間。
func Now() Time
package main import ( "fmt" "time" ) func main() { now := time.Now() // 獲取當(dāng)前時間 fmt.Printf("current time:%v\n", now) }
2.2. 獲取指定時間
time.Date()函數(shù)可以獲取指定的時間,其參數(shù)分別是:年、月、日、時、分、秒、納秒、時區(qū)。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
package main import ( "fmt" "time" ) func main() { // 獲取指定時間 date := time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local) fmt.Printf("date:%v\n", date) }
3. 格式化時間
3.1. 時間類型轉(zhuǎn)字符串
Go 語言中可以通過 time.Time 類型的 Format()函數(shù)對時間進(jìn)行格式化,該函數(shù)的第一個參數(shù)是格式化的模板,模板里面的時間必須是 2006-01-02 15:04:05 這個時間,這個時間是固定的,不然就會出錯,第二個參數(shù)是要格式化的時間。
func (t Time) Format(layout string) string
package main import ( "fmt" "time" ) func main() { now := time.Now() // 獲取當(dāng)前時間 // 格式化的模板為Go的出生時間2006年1月2號15點(diǎn)04分 Mon Jan fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan")) fmt.Println(now.Format("2006/01/02 15:04")) fmt.Println(now.Format("15:04 2006/01/02")) }
3.2. 字符串轉(zhuǎn)時間類型
Go 語言中可以通過 time.Parse()函數(shù)對字符串進(jìn)行解析,生成對應(yīng)的 time.Time 類型的時間。
func Parse(layout, value string) (Time, error)
package main import ( "fmt" "time" ) func main() { // 加載時區(qū) loc, _ := time.LoadLocation("Asia/Shanghai") // 按照指定時區(qū)和指定格式解析字符串時間 timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc) if err != nil { fmt.Printf("parse time failed, err:%v\n", err) return } fmt.Println(timeObj) }
4. 時間常量
const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
5. 時間操作
5.1. 獲取時間戳
時間戳是自 1970 年 1 月 1 日(08:00:00GMT)至當(dāng)前時間的總毫秒數(shù)。它也被稱為 Unix 時間戳(UnixTimestamp)。
func (t Time) Unix() int64
package main import ( "fmt" "time" ) func main() { now := time.Now() timestamp1 := now.Unix() // 時間戳 timestamp2 := now.UnixNano() // 納秒時間戳 fmt.Printf("current timestamp1:%v\n", timestamp1) fmt.Printf("current timestamp2:%v\n", timestamp2) }
5.2. 時間間隔
time.Duration 是 time 包定義的一個類型,它代表兩個時間點(diǎn)之間經(jīng)過的時間,以納秒為單位。time.Duration 表示一段時間間隔,可表示的最長時間段大約 290 年。
const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
package main import ( "fmt" "time" ) func main() { now := time.Now() // 程序執(zhí)行到這里會暫停2秒 time.Sleep(2 * time.Second) fmt.Println("2 seconds later") // 兩個時間相減 fmt.Printf("passed %v\n", time.Since(now)) }
5.3. 定時器
time.Timer 類型表示單次時間事件。當(dāng)定時器到期時,當(dāng)前時間會被發(fā)送給 C,除非定時器是被 AfterFunc 函數(shù)創(chuàng)建的。因此,如果程序持有定時器的唯一引用,當(dāng)定時器觸發(fā)時,它會被釋放,并停止定時器。
func AfterFunc(d Duration, f func()) *Timer
package main import ( "fmt" "time" ) func main() { timer := time.Tick(time.Second) // 定義一個1秒間隔的定時器 for t := range timer { fmt.Println(t) // 1秒鐘執(zhí)行一次 } }
5.4. 定時器
time.Ticker 類型代表一個間隔觸發(fā)的時間事件,它會以一個間隔(例如,1 秒、1 分鐘等)觸發(fā)多次,發(fā)送一個事件給一個通道。
func Tick(d Duration) *Ticker
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(time.Second) // 定義一個1秒間隔的定時器 for t := range ticker.C { fmt.Println(t) // 1秒鐘執(zhí)行一次 } }
6. 時區(qū)
Go 語言中通過 LoadLocation()函數(shù)加載時區(qū)信息,它的參數(shù)是時區(qū)的名字。時區(qū)信息我們可以通過 time 包中的 LoadLocation(name string) (*Location, error)函數(shù)獲取,它返回一個 Location 對象,然后我們就可以通過 LoadLocation()函數(shù)加載時區(qū)信息了。
func LoadLocation(name string) (*Location, error)
package main import ( "fmt" "time" ) func main() { // 加載時區(qū) loc, err := time.LoadLocation("Asia/Shanghai") if err != nil { fmt.Printf("load location failed, err:%v\n", err) return } // 按照指定時區(qū)和指定格式解析字符串時間 timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc) if err != nil { fmt.Printf("parse time failed, err:%v\n", err) return } fmt.Println(timeObj) }
7. 時區(qū)轉(zhuǎn)換
func (t Time) In(loc *Location) Time
package main import ( "fmt" "time" ) func main() { // 加載時區(qū) loc, _ := time.LoadLocation("Asia/Shanghai") // 按照指定時區(qū)和指定格式解析字符串時間 timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc) if err != nil { fmt.Printf("parse time failed, err:%v\n", err) return } fmt.Println(timeObj) // 按照東八區(qū)的時區(qū)和格式去解析字符串時間 timeObj, err = time.Parse("2006/01/02 15:04:05", "2020/01/01 00:00:00") if err != nil { fmt.Printf("parse time failed, err:%v\n", err) return } fmt.Println(timeObj) // 將timeObj轉(zhuǎn)換到指定時區(qū) newTime := timeObj.In(loc) fmt.Println(newTime) }
總結(jié)
到此這篇關(guān)于Go時間操作常用方法的文章就介紹到這了,更多相關(guān)Go時間操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn)
本文主要介紹了Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07go引入自建包名報(bào)錯:package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報(bào)錯:package?XXX?is?not?in?std的解決辦法,這是在寫測試引入包名的時候遇到的錯誤提示,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解
經(jīng)過前面的幾節(jié)對pprof的介紹,對pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來分析下這部分2023-04-04go-zero源碼閱讀之布隆過濾器實(shí)現(xiàn)代碼
布隆過濾器可以用于檢索一個元素是否在一個集合中。它的優(yōu)點(diǎn)是空間效率和查詢時間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識別率和刪除困難,這篇文章主要介紹了go-zero源碼閱讀-布隆過濾器,需要的朋友可以參考下2023-02-02Golang WaitGroup實(shí)現(xiàn)原理解析
WaitGroup是Golang并發(fā)的兩種方式之一,一個是Channel,另一個是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下2023-02-02