欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Go中處理時間數(shù)據(jù)的方法

 更新時間:2023年04月18日 10:13:15   作者:洛天楓  
在許多場合,你將不得不編寫必須處理時間的代碼。在Go中處理時間數(shù)據(jù)需要你從Go標準庫中導入?time?包。這個包有很多方法和類型供你使用,但我選取了最常用的方法和類型,并在這篇文章中進行了描述,感興趣的可以了解一下

在許多場合,你將不得不編寫必須處理時間的代碼。你可以寫一個時鐘程序,或者在你的代碼中測量兩點之間的時間差。無論是哪種方式,知道如何在Go中處理時間數(shù)據(jù)是很重要的。這很簡單,了解一些有趣的函數(shù)可以幫助你節(jié)省時間。在Go中處理時間數(shù)據(jù)需要你從Go標準庫中導入 time 包。這個包有很多方法和類型供你使用,但我選取了最常用的方法和類型,并在這篇文章中進行了描述。如果你想看更多關于這個主題的信息,請查看time包的文檔頁面。

獲取時間

這可能是軟件包中最常用的方法。我們如何知道當前的時間呢?像這樣:

t := time.Now()
fmt.Println(t)

輸出:

2023-04-16 23:54:45.924965 +0800 CST m=+0.000152293

這就是當前的時間。這是很麻煩的,所以我將把它分解成幾個部分。

  • 2023-02-06:年月日。
  • 23:01:48.9983151:時、分、秒
  • 0800:與 GMT 的時差。
  • CST:您所在的當前時區(qū)。
  • m=+0.000152293: 單調時鐘讀數(shù)。

我們將在本文后面介紹單調時鐘。 我們現(xiàn)在可以繼續(xù)前進。

有沒有更好的方法來格式化這個

你打賭。

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

以下是如何提取時間的每個元素。 很簡單,對吧?

我們如何以更漂亮的格式打印它?

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

輸出:

2023 4 17

您可以看到我們如何使用 fmt.Printf 函數(shù)來根據(jù)自己的喜好格式化時間。

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

有一種更好的格式化時間的方法

幸運的是,我們有 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

我認為這是我剛開始學習這個主題時最讓我失望的部分。 這也是您可以看到語言設計者有多么厚顏無恥的部分。

我們可以看到 time.Format 接受一個字符串,該字符串表示我們希望時間采用的格式。這是奇怪的部分,因為 Go 對格式字符串的格式非常非常講究。

Mon Apr 17 00:06:21 2023 CST

格式字符串必須是該字符串的變體,否則代碼會打印出奇怪的時間。 有趣的是,如果排除 Mon,格式字符串的每個元素都代表一個整數(shù)。 Jan 是 1,2 是 2,15 是 3。

1 2 3 4 5 6 -7

不過,從上面的代碼中,您可以看到我們如何按照我們想要的方式格式化我們的時間。 而且我們不必編寫額外的函數(shù)來將小時轉換為 12 或 24 小時制,或者將每個整數(shù)映射到月份。

您也可以使用預定義的格式,如下所示:

fmt.Println(time.UnixDate)
fmt.Println(time.RFC3339)

輸出:

Mon Jan _2 15:04:05 MST 2006
2006-01-02T15:04:05Z07:00

查看文檔以了解更多格式。

不同的時區(qū)呢

如上所示,系統(tǒng)會自動檢測時區(qū)。 但是,在某些情況下,您可能需要顯示不同時區(qū)的時間。

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() 獲取本地時區(qū),這與 time.Now() 會自動檢測到的時間相同。 調用 UTC() 會將時區(qū)轉換為 UTC。

但是,如果我們需要更強大的東西怎么辦?

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)境。 您可以使用此結果通過傳入你的 time.In 來轉換您的時間。

您還可以從字符串中讀取時間

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

默認情況下,時間庫適用于 time.Time 類型。 但是,我們可以使用 time.Parse 來解析這些時間戳字符串。

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。

等等,什么是單調時鐘

讓我們回到這個話題。 這聽起來比實際情況要可怕得多。

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

雖然掛鐘擅長報時,但不適合測量時間。 例如,看看這段代碼。

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

上面的代碼測量了 t1 和 t2 之間經過的時間。 這看起來很明顯,因為我們在聲明 t2 之前等待了一秒鐘。 但是,如果我們以某種方式設法在該跨度內切換我們的操作系統(tǒng)時間設置呢? 如果我們將系統(tǒng)時鐘增加 4 小時,是否意味著 t1 和 t2 之間經過的時間為 4 小時 1 秒? 這是荒謬的!

這就是 Go 使用單調時鐘來測量時間的原因。 從打印出來的時間里的m值可以看出,時間差大約是一秒。 單調時鐘允許準確測量時間。

結論

我們對時間的概念如此熟悉,以至于我們傾向于認為我們對它的理解是理所當然的。 然而,時間往往是在計算機中表示的更令人沮喪的事物之一。 幸運的是,Go 開發(fā)人員已經從我們這里抽象出了大部分原始轉換,這樣我們就可以使用 time 包的簡單易懂的功能。 這篇文章涵蓋了很多必要的功能,但如果您需要細節(jié),您可以隨時參考官方文檔。

到此這篇關于詳解Go中處理時間數(shù)據(jù)的方法的文章就介紹到這了,更多相關Go處理時間數(shù)據(jù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • go語言通過結構體生成json示例解析

    go語言通過結構體生成json示例解析

    這篇文章主要為大家介紹了go語言通過結構體生成json示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • go select的用法

    go select的用法

    本文主要介紹了go select的用法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go語言指針訪問結構體的方法

    Go語言指針訪問結構體的方法

    這篇文章主要介紹了Go語言指針訪問結構體的方法,涉及Go語言指針及結構體的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Go panic和recover函數(shù)使用細節(jié)深入探究

    Go panic和recover函數(shù)使用細節(jié)深入探究

    這篇文章主要為大家介紹了Go?的panic和recover函數(shù)使用細節(jié)深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • go goroutine 怎樣進行錯誤處理

    go goroutine 怎樣進行錯誤處理

    在 Go 語言程序開發(fā)中,goroutine 的使用是比較頻繁的,因此在日常編碼的時候 goroutine 里的錯誤處理,怎么做會比較好呢,本文就來詳細介紹一下
    2021-07-07
  • 詳解golang中的method

    詳解golang中的method

    這篇文章主要介紹了golang中的method的相關資料,幫助大家更好的理解和使用golang,感興趣的朋友可以了解下
    2021-01-01
  • Golang中 import cycle not allowed 問題的解決方法

    Golang中 import cycle not allowed 問題

    這篇文章主要介紹了Golang中 import cycle not allowed 問題的解決方法,問題從描述到解決都非常詳細,需要的小伙伴可以參考一下
    2022-03-03
  • GO語言開發(fā)終端命令行小工具改進更新

    GO語言開發(fā)終端命令行小工具改進更新

    這篇文章主要為大家介紹了GO語言開發(fā)終端命令行小工具的改進更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Golang中interface{}轉為數(shù)組的操作

    Golang中interface{}轉為數(shù)組的操作

    這篇文章主要介紹了Golang中interface{}轉為數(shù)組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go slice 擴容實現(xiàn)原理源碼解析

    go slice 擴容實現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論