Go語言Time包的具體使用
time包
Go語言中有關(guān)于時(shí)間和日期的方法都在time包里面,Go語言的time包為開發(fā)者提供了一套全面而簡潔的工具來處理時(shí)間相關(guān)的操作。包括解析和格式化時(shí)間字符串,計(jì)算時(shí)間差和時(shí)區(qū)轉(zhuǎn)換等,time包時(shí)Go語言中處理時(shí)間和日期的核心組件。
時(shí)間類型(Time)
time包中的Time結(jié)構(gòu)體表示的是時(shí)間類型,在Go語言中,我們可以使用time.Now()方法來獲取當(dāng)前的時(shí)間,該方法返回的就是Time類型,調(diào)用Time類型的方法就可以分別獲取到當(dāng)前時(shí)間的年月日時(shí)分秒等信息。
func main() { now := time.Now() fmt.Println(now) // 2024-07-23 19:36:03.4481196 +0800 CST m=+0.004232101 fmt.Println(now.Year()) // 2024 fmt.Println(now.Month()) // July fmt.Println(now.Day()) // 23 fmt.Println(now.Hour()) // 19 fmt.Println(now.Minute()) // 36 fmt.Println(now.Second()) // 3 }
時(shí)間格式化
從上面的輸出可以看到當(dāng)前日期的輸出后面還攜帶了有其他的消息,不是我們常用的格式,這個(gè)時(shí)候就可以使用Go語言的時(shí)間格式化功能,使用format方法并執(zhí)行格式化模板,Go語言的格式化模版并不是常用的Y-m-d H:M:S,而是2006-01-02 15:04:05,記憶方法:200612345(相傳這個(gè)時(shí)間為Go語言誕生時(shí)間,不知真假)。
func main() { now := time.Now() fmt.Println(now.Format("2006-01-02 15:04:05")) // 2024-07-23 19:37:58 fmt.Println(now.Format("2006-01-02 03:04:05 PM")) // 2024-07-23 07:41:20 PM fmt.Println(now.Format("2006/01/02 15:04")) // 2024/07/23 19:40 fmt.Println(now.Format("15:04 2006/01/02")) // 19:40 2024/07/23 fmt.Println(now.Format("2006/01/02")) // 2024/07/23 }
除了自己寫格式化模版之外,Go語言已經(jīng)內(nèi)置了一部分模版可供選擇,模版在format包里面,可以直接使用,源碼如下:
const ( Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order. 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 with numeric zone 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 with numeric zone RFC3339 = "2006-01-02T15:04:05Z07:00" RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00" Kitchen = "3:04PM" // Handy time stamps. Stamp = "Jan _2 15:04:05" StampMilli = "Jan _2 15:04:05.000" StampMicro = "Jan _2 15:04:05.000000" StampNano = "Jan _2 15:04:05.000000000" DateTime = "2006-01-02 15:04:05" DateOnly = "2006-01-02" TimeOnly = "15:04:05" )
時(shí)間戳
時(shí)間戳是自1970年1月1日(08:00:00GMT)至當(dāng)前時(shí)間的總毫秒數(shù),也被稱為Unix時(shí)間戳,在Go語言里面,可以獲取四種級(jí)別的時(shí)間戳,分別是秒、毫秒、微秒和納秒。
func main() { now := time.Now() fmt.Println(now.Unix()) // 1721735188 fmt.Println(now.UnixMilli()) // 1721735188504 fmt.Println(now.UnixMicro()) // 1721735188504566 fmt.Println(now.UnixNano()) // 1721735188504566800 }
時(shí)間間隔
在time包里面還定義了一個(gè)Duration類型,Duration表示時(shí)間間隔,例如可以直接使用time.Second表示1秒,time.Hour * 3表示3個(gè)小時(shí),Duration源碼定義如下:
const ( Nanosecond Duration = 1 Microsecond = 1000 * Nanosecond Millisecond = 1000 * Microsecond Second = 1000 * Millisecond Minute = 60 * Second Hour = 60 * Minute )
時(shí)間操作
在Go語言里面還可以非常簡單的進(jìn)行時(shí)間的比較以及計(jì)算
時(shí)間計(jì)算
可以使用Add方法在當(dāng)前時(shí)間的基礎(chǔ)上加上指定的時(shí)間間隔。
func main() { now := time.Now() fmt.Println(now) // 2024-07-23 19:52:14.0840934 +0800 CST m=+0.004981601 fmt.Println(now.Add(time.Hour * 2)) // 2024-07-23 21:52:14.0840934 +0800 CST m=+7200.004981601 }
時(shí)間間隔
還可以使用Sub方法計(jì)算兩個(gè)時(shí)間之間相隔了多長時(shí)間,
func main() { now := time.Now() fmt.Println(now.Sub(now.Add(time.Hour * -2))) // 2h0m0s }
之前
使用Before判斷一個(gè)時(shí)間是否在另一個(gè)時(shí)間之前
func main() { now := time.Now() fmt.Println(now.Before(now.Add(time.Hour))) // true }
之后
使用After判斷一個(gè)時(shí)間是否在另一個(gè)時(shí)間之后
func main() { now := time.Now() fmt.Println(now.After(now.Add(time.Hour))) // false }
相同
使用Equal判斷兩個(gè)時(shí)間是否相同
func main() { now := time.Now() fmt.Println(now.Equal(now.Add(time.Hour))) // false }
時(shí)間轉(zhuǎn)換
字符串轉(zhuǎn)時(shí)間
func main() { timeStr := "2024-07-23 12:23:34" time1, _ := time.Parse(time.DateTime, timeStr) fmt.Println(time1) // 2024-07-23 12:23:34 +0000 UTC time2, _ := time.ParseInLocation(time.DateTime, timeStr, time.Local) fmt.Println(time2) // 2024-07-23 12:23:34 +0800 CST }
可以使用Parse和ParseInLocation將字符串時(shí)間轉(zhuǎn)成Time類型的時(shí)間,兩者的區(qū)別如下:
- time.Parse 總是將時(shí)間解析為 UTC 時(shí)區(qū)
- time.ParseInLocation 允許指定一個(gè)時(shí)區(qū)解析
時(shí)間戳轉(zhuǎn)時(shí)間
func main() { time1 := time.Unix(1721735188, 0) time2 := time.UnixMilli(1721735188504) time3 := time.UnixMicro(1721735188504566) fmt.Println(time1) // 2024-07-23 19:46:28 +0800 CST fmt.Println(time2) // 2024-07-23 19:46:28.504 +0800 CST fmt.Println(time3) // 2024-07-23 19:46:28.504566 +0800 CST }
使用time包的Unix、UnixMilli和UnixMicro可以分別將秒、毫秒、微秒級(jí)別的時(shí)間戳轉(zhuǎn)成相應(yīng)的Time類型的時(shí)間。
到此這篇關(guān)于Go語言Time包的文章就介紹到這了,更多相關(guān)Go語言Time包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go slice 數(shù)組和切片使用區(qū)別示例解析
這篇文章主要為大家介紹了go slice 數(shù)組和切片使用區(qū)別示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01golang實(shí)現(xiàn)數(shù)組分割的示例代碼
本文主要介紹了golang實(shí)現(xiàn)數(shù)組分割的示例代碼,要求把數(shù)組分割成多個(gè)正整數(shù)大小的數(shù)組,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12golang 內(nèi)存對(duì)齊的實(shí)現(xiàn)
在代碼編譯階段,編譯器會(huì)對(duì)數(shù)據(jù)的存儲(chǔ)布局進(jìn)行對(duì)齊優(yōu)化,本文主要介紹了golang 內(nèi)存對(duì)齊的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08