詳解Go中處理時(shí)間數(shù)據(jù)的方法
在許多場(chǎng)合,你將不得不編寫(xiě)必須處理時(shí)間的代碼。你可以寫(xiě)一個(gè)時(shí)鐘程序,或者在你的代碼中測(cè)量?jī)牲c(diǎn)之間的時(shí)間差。無(wú)論是哪種方式,知道如何在Go中處理時(shí)間數(shù)據(jù)是很重要的。這很簡(jiǎn)單,了解一些有趣的函數(shù)可以幫助你節(jié)省時(shí)間。在Go中處理時(shí)間數(shù)據(jù)需要你從Go標(biāo)準(zhǔn)庫(kù)中導(dǎo)入 time
包。這個(gè)包有很多方法和類(lèi)型供你使用,但我選取了最常用的方法和類(lèi)型,并在這篇文章中進(jìn)行了描述。如果你想看更多關(guān)于這個(gè)主題的信息,請(qǐng)查看time
包的文檔頁(yè)面。
獲取時(shí)間
這可能是軟件包中最常用的方法。我們?nèi)绾沃喇?dāng)前的時(shí)間呢?像這樣:
t := time.Now() fmt.Println(t)
輸出:
2023-04-16 23:54:45.924965 +0800 CST m=+0.000152293
這就是當(dāng)前的時(shí)間。這是很麻煩的,所以我將把它分解成幾個(gè)部分。
2023-02-06
:年月日。23:01:48.9983151
:時(shí)、分、秒0800
:與 GMT 的時(shí)差。- CST:您所在的當(dāng)前時(shí)區(qū)。
m=+0.000152293
: 單調(diào)時(shí)鐘讀數(shù)。
我們將在本文后面介紹單調(diào)時(shí)鐘。 我們現(xiàn)在可以繼續(xù)前進(jìn)。
有沒(méi)有更好的方法來(lái)格式化這個(gè)
你打賭。
t := time.Now() fmt.Println(t.Year()) fmt.Println(t.Month()) fmt.Println(t.Day()) fmt.Println(t.Date()) fmt.Println(t.Hour()) fmt.Println(t.Minute()) fmt.Println(t.Second())
輸出:
2023
April
17
2023 April 17
0
3
31
以下是如何提取時(shí)間的每個(gè)元素。 很簡(jiǎn)單,對(duì)吧?
我們?nèi)绾我愿恋母袷酱蛴∷?/p>
fmt.Printf("%d %d %d\n", t.Year(), t.Month(), t.Day())
輸出:
2023 4 17
您可以看到我們?nèi)绾问褂?fmt.Printf
函數(shù)來(lái)根據(jù)自己的喜好格式化時(shí)間。
但是如果我們想用名字顯示月份,比如二月而不是 2 怎么辦? 如果我們想以 12 小時(shí)制而不是 24 小時(shí)制顯示時(shí)間怎么辦? 你可以看到它是如何很快變得復(fù)雜的。
有一種更好的格式化時(shí)間的方法
幸運(yùn)的是,我們有 time.Format
函數(shù)來(lái)幫助我們。 讓我們看看它是如何工作的。
fmt.Println(t.Format("Mon Jan 2 15:04:05 2006 MST")) fmt.Println(t.Format("Mon Jan 2 15:04:05")) fmt.Println(t.Format("2006/01/02")) fmt.Println(t.Format("3:04PM")) fmt.Println(t.Format("15:04PM"))
輸出:
Mon Apr 17 00:06:21 2023 CST
Mon Apr 17 00:06:21
2023/04/17
12:06AM
00:06AM
我認(rèn)為這是我剛開(kāi)始學(xué)習(xí)這個(gè)主題時(shí)最讓我失望的部分。 這也是您可以看到語(yǔ)言設(shè)計(jì)者有多么厚顏無(wú)恥的部分。
我們可以看到 time.Format 接受一個(gè)字符串,該字符串表示我們希望時(shí)間采用的格式。這是奇怪的部分,因?yàn)?Go 對(duì)格式字符串的格式非常非常講究。
Mon Apr 17 00:06:21 2023 CST
格式字符串必須是該字符串的變體,否則代碼會(huì)打印出奇怪的時(shí)間。 有趣的是,如果排除 Mon,格式字符串的每個(gè)元素都代表一個(gè)整數(shù)。 Jan 是 1,2 是 2,15 是 3。
1 2 3 4 5 6 -7
不過(guò),從上面的代碼中,您可以看到我們?nèi)绾伟凑瘴覀兿胍姆绞礁袷交覀兊臅r(shí)間。 而且我們不必編寫(xiě)額外的函數(shù)來(lái)將小時(shí)轉(zhuǎn)換為 12 或 24 小時(shí)制,或者將每個(gè)整數(shù)映射到月份。
您也可以使用預(yù)定義的格式,如下所示:
fmt.Println(time.UnixDate) fmt.Println(time.RFC3339)
輸出:
Mon Jan _2 15:04:05 MST 2006
2006-01-02T15:04:05Z07:00
查看文檔以了解更多格式。
不同的時(shí)區(qū)呢
如上所示,系統(tǒng)會(huì)自動(dòng)檢測(cè)時(shí)區(qū)。 但是,在某些情況下,您可能需要顯示不同時(shí)區(qū)的時(shí)間。
nt := time.Now() lt := time.Now().Local() ut := time.Now().UTC() fmt.Println(nt) fmt.Println(lt) fmt.Println(ut)
輸出:
2023-04-17 00:11:10.214751 +0800 CST m=+0.000135417
2023-04-17 00:11:10.214751 +0800 CST
2023-04-16 16:11:10.214751 +0000 UTC
Local() 獲取本地時(shí)區(qū),這與 time.Now() 會(huì)自動(dòng)檢測(cè)到的時(shí)間相同。 調(diào)用 UTC() 會(huì)將時(shí)區(qū)轉(zhuǎn)換為 UTC。
但是,如果我們需要更強(qiáng)大的東西怎么辦?
l, _ := time.LoadLocation("UTC") fmt.Printf("%s\n", nt.In(l)) l, _ = time.LoadLocation("Europe/London") fmt.Printf("%s\n", nt.In(l)) l, _ = time.LoadLocation("America/Los_Angeles") fmt.Printf("%s\n", nt.In(l)) l, _ = time.LoadLocation("Asia/Seoul") fmt.Printf("%s\n", nt.In(l))
輸出:
2023-04-16 16:12:00.918525 +0000 UTC
2023-04-16 17:12:00.918525 +0100 BST
2023-04-16 09:12:00.918525 -0700 PDT
2023-04-17 01:12:00.918525 +0900 KST
time.LoadLocation
將加載您選擇的語(yǔ)言環(huán)境。 您可以使用此結(jié)果通過(guò)傳入你的 time.In 來(lái)轉(zhuǎn)換您的時(shí)間。
您還可以從字符串中讀取時(shí)間
在許多情況下,您將不得不讀入一個(gè)字符串。 通常,這些將是時(shí)間戳。 在這些時(shí)間戳字符串上使用時(shí)間庫(kù)的函數(shù)不是很好嗎?
默認(rèn)情況下,時(shí)間庫(kù)適用于 time.Time 類(lèi)型。 但是,我們可以使用 time.Parse 來(lái)解析這些時(shí)間戳字符串。
timestamp := "2023-02-06 23:49:01" ts, err := time.Parse("2006-01-02 15:04:05", timestamp) if err != nil { fmt.Println(err) } fmt.Println(ts)
輸出:
2023-02-06 23:49:01 +0000 UTC
您還可以使用上述 Format 方法格式化 ts。
等等,什么是單調(diào)時(shí)鐘
讓我們回到這個(gè)話題。 這聽(tīng)起來(lái)比實(shí)際情況要可怕得多。
您的計(jì)算機(jī)有一個(gè)計(jì)時(shí)時(shí)鐘。 很有可能這次相當(dāng)不穩(wěn)定。 有沒(méi)有過(guò)在去另一個(gè)國(guó)家旅行后你的時(shí)鐘慢了幾個(gè)小時(shí)的經(jīng)歷? 是否曾經(jīng)需要重新設(shè)置您的時(shí)鐘以使其與您的手表相匹配? 這個(gè)時(shí)鐘叫做掛鐘,很容易改變。
雖然掛鐘擅長(zhǎng)報(bào)時(shí),但不適合測(cè)量時(shí)間。 例如,看看這段代碼。
t1 := time.Now() fmt.Println(t1) time.Sleep(time.Second) t2 := time.Now() fmt.Println(time.Now()) fmt.Println(t2.Sub(t1))
輸出:
2023-04-17 00:15:32.65858 +0800 CST m=+0.000109168
2023-04-17 00:15:33.660121 +0800 CST m=+1.001672543
1.001563166s
上面的代碼測(cè)量了 t1 和 t2 之間經(jīng)過(guò)的時(shí)間。 這看起來(lái)很明顯,因?yàn)槲覀冊(cè)诼暶?t2 之前等待了一秒鐘。 但是,如果我們以某種方式設(shè)法在該跨度內(nèi)切換我們的操作系統(tǒng)時(shí)間設(shè)置呢? 如果我們將系統(tǒng)時(shí)鐘增加 4 小時(shí),是否意味著 t1 和 t2 之間經(jīng)過(guò)的時(shí)間為 4 小時(shí) 1 秒? 這是荒謬的!
這就是 Go 使用單調(diào)時(shí)鐘來(lái)測(cè)量時(shí)間的原因。 從打印出來(lái)的時(shí)間里的m值可以看出,時(shí)間差大約是一秒。 單調(diào)時(shí)鐘允許準(zhǔn)確測(cè)量時(shí)間。
結(jié)論
我們對(duì)時(shí)間的概念如此熟悉,以至于我們傾向于認(rèn)為我們對(duì)它的理解是理所當(dāng)然的。 然而,時(shí)間往往是在計(jì)算機(jī)中表示的更令人沮喪的事物之一。 幸運(yùn)的是,Go 開(kāi)發(fā)人員已經(jīng)從我們這里抽象出了大部分原始轉(zhuǎn)換,這樣我們就可以使用 time 包的簡(jiǎn)單易懂的功能。 這篇文章涵蓋了很多必要的功能,但如果您需要細(xì)節(jié),您可以隨時(shí)參考官方文檔。
到此這篇關(guān)于詳解Go中處理時(shí)間數(shù)據(jù)的方法的文章就介紹到這了,更多相關(guān)Go處理時(shí)間數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語(yǔ)言通過(guò)結(jié)構(gòu)體生成json示例解析
這篇文章主要為大家介紹了go語(yǔ)言通過(guò)結(jié)構(gòu)體生成json示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法
這篇文章主要介紹了Go語(yǔ)言指針訪問(wèn)結(jié)構(gòu)體的方法,涉及Go語(yǔ)言指針及結(jié)構(gòu)體的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02Go panic和recover函數(shù)使用細(xì)節(jié)深入探究
這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細(xì)節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12go goroutine 怎樣進(jìn)行錯(cuò)誤處理
在 Go 語(yǔ)言程序開(kāi)發(fā)中,goroutine 的使用是比較頻繁的,因此在日常編碼的時(shí)候 goroutine 里的錯(cuò)誤處理,怎么做會(huì)比較好呢,本文就來(lái)詳細(xì)介紹一下2021-07-07Golang中 import cycle not allowed 問(wèn)題
這篇文章主要介紹了Golang中 import cycle not allowed 問(wèn)題的解決方法,問(wèn)題從描述到解決都非常詳細(xì),需要的小伙伴可以參考一下2022-03-03GO語(yǔ)言開(kāi)發(fā)終端命令行小工具改進(jìn)更新
這篇文章主要為大家介紹了GO語(yǔ)言開(kāi)發(fā)終端命令行小工具的改進(jìn)更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Golang中interface{}轉(zhuǎn)為數(shù)組的操作
這篇文章主要介紹了Golang中interface{}轉(zhuǎn)為數(shù)組的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析
這篇文章主要為大家介紹了go slice 擴(kuò)容實(shí)現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01