溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Go中怎么處理時(shí)間數(shù)據(jù)

發(fā)布時(shí)間:2023-04-18 15:40:20 來源:億速云 閱讀:115 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“Go中怎么處理時(shí)間數(shù)據(jù)”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Go中怎么處理時(shí)間數(shù)據(jù)”文章能幫助大家解決問題。

獲取時(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)。

有沒有更好的方法來格式化這個(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è)元素。 很簡單,對(duì)吧?

我們?nèi)绾我愿恋母袷酱蛴∷?/p>

fmt.Printf("%d %d %d\n", t.Year(), t.Month(), t.Day())

輸出:

2023 4 17

您可以看到我們?nèi)绾问褂?fmt.Printf 函數(shù)來根據(jù)自己的喜好格式化時(shí)間。

但是如果我們想用名字顯示月份,比如二月而不是 2 怎么辦? 如果我們想以 12 小時(shí)制而不是 24 小時(shí)制顯示時(shí)間怎么辦? 你可以看到它是如何很快變得復(fù)雜的。

有一種更好的格式化時(shí)間的方法

幸運(yùn)的是,我們有 time.Format 函數(shù)來幫助我們。 讓我們看看它是如何工作的。

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)為這是我剛開始學(xué)習(xí)這個(gè)主題時(shí)最讓我失望的部分。 這也是您可以看到語言設(shè)計(jì)者有多么厚顏無恥的部分。

我們可以看到 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

不過,從上面的代碼中,您可以看到我們?nèi)绾伟凑瘴覀兿胍姆绞礁袷交覀兊臅r(shí)間。 而且我們不必編寫額外的函數(shù)來將小時(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 將加載您選擇的語言環(huán)境。 您可以使用此結(jié)果通過傳入你的 time.In 來轉(zhuǎn)換您的時(shí)間。

您還可以從字符串中讀取時(shí)間

在許多情況下,您將不得不讀入一個(gè)字符串。 通常,這些將是時(shí)間戳。 在這些時(shí)間戳字符串上使用時(shí)間庫的函數(shù)不是很好嗎?

默認(rèn)情況下,時(shí)間庫適用于 time.Time 類型。 但是,我們可以使用 time.Parse 來解析這些時(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è)話題。 這聽起來比實(shí)際情況要可怕得多。

您的計(jì)算機(jī)有一個(gè)計(jì)時(shí)時(shí)鐘。 很有可能這次相當(dāng)不穩(wěn)定。 有沒有過在去另一個(gè)國家旅行后你的時(shí)鐘慢了幾個(gè)小時(shí)的經(jīng)歷? 是否曾經(jīng)需要重新設(shè)置您的時(shí)鐘以使其與您的手表相匹配? 這個(gè)時(shí)鐘叫做掛鐘,很容易改變。

雖然掛鐘擅長報(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)過的時(shí)間。 這看起來很明顯,因?yàn)槲覀冊(cè)诼暶?t2 之前等待了一秒鐘。 但是,如果我們以某種方式設(shè)法在該跨度內(nèi)切換我們的操作系統(tǒng)時(shí)間設(shè)置呢? 如果我們將系統(tǒng)時(shí)鐘增加 4 小時(shí),是否意味著 t1 和 t2 之間經(jīng)過的時(shí)間為 4 小時(shí) 1 秒? 這是荒謬的!

這就是 Go 使用單調(diào)時(shí)鐘來測(cè)量時(shí)間的原因。 從打印出來的時(shí)間里的m值可以看出,時(shí)間差大約是一秒。 單調(diào)時(shí)鐘允許準(zhǔn)確測(cè)量時(shí)間。

關(guān)于“Go中怎么處理時(shí)間數(shù)據(jù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI