Go語言中時間time相關(guān)處理方法詳解
引言
在Go語言中,time 包是處理時間和日期的核心。它提供了豐富的函數(shù)和方法,用于顯示、測量、計算、格式化、解析時間等。
1. 時間的基本獲取
在Go語言中,time.Time 類型用于表示時間。我們可以通過 time.Now() 函數(shù)獲取當(dāng)前的時間對象,進(jìn)而獲取年、月、日、時、分、秒等信息。
示例代碼
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Printf("current time: %v\n", now)
//得到的是time.Time類型的結(jié)構(gòu)體數(shù)據(jù),包含 常量:日月年時分秒 周日-周六 方法:獲取常量,計算。
fmt.Printf("current time數(shù)據(jù)類型: %T\n", now)
//打印年月日時分秒,得到的都是int類型數(shù)據(jù)
year := now.Year()
month := now.Month()
day := now.Day()
hour := now.Hour()
minute := now.Minute()
second := now.Second()
//Printf : 整數(shù)補(bǔ)位--02如果不足兩位,左側(cè)用0補(bǔ)齊輸出
fmt.Printf("%d-%02d-%02d %02d:%02d:%02d\n", year, month, day, hour, minute, second)
}
通過now.Year()等得到的都是int類型數(shù)據(jù)


2. 時間戳的獲取與轉(zhuǎn)換
時間戳是自1970年1月1日(08:00:00 GMT)至當(dāng)前時間的總秒數(shù)(或毫秒數(shù))。
Go語言中,可以通過time.Now().Unix()獲取秒級時間戳,通過time.Now().UnixNano()獲取納秒級時間戳。
示例代碼
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)
// 將時間戳轉(zhuǎn)換為時間對象
timeObj := time.Unix(timestamp1, 0)
fmt.Println(timeObj)
// 轉(zhuǎn)換為指定時區(qū)的時間對象
secondsEastOfUTC := int((8 * time.Hour).Seconds())
beijing := time.FixedZone("Beijing Time", secondsEastOfUTC)
beijingTimeObj := time.Unix(timestamp1, 0).In(beijing)
fmt.Println(beijingTimeObj)
}

通過time.Now().Unix()獲取的時間戳是int64數(shù)據(jù)類型

如果想要通過時間戳字符串轉(zhuǎn)化為時間格式,需要將時間戳字符串轉(zhuǎn)化為int64類型數(shù)據(jù)
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
//時間戳字符串
timrstr := "1617922800"
//時間戳是int64類型數(shù)據(jù),將時間戳字符串轉(zhuǎn)化為int64類型
timestamp, err := strconv.ParseInt(timrstr, 10, 64)
if err != nil {
fmt.Println("err:", err)
return
}
t := time.Unix(timestamp, 0)
fmt.Println(t)
}

3. 時間的格式化
Go語言允許你按照特定的格式來格式化時間對象,或者將字符串按照指定的格式解析為時間對象。
time.Time 提供了 Format 方法來格式化時間。
func (t Time) Format(layout string) string
Go語言的時間格式化模板不是常見的Y-m-d H:M:S,而是使用Go的誕生時間2006年1月2日 15點(diǎn)04分作為記憶口訣。
格式化模板使用Go的出生時間“2006年1月2日 15時04分05秒”(記憶口訣為“2006 1 2 3 4 5”)。
模板必須用這個時間,否則格式化不了
格式化時間
package main
import (
"fmt"
"time"
)
func main() {
// 時間格式化 2023-02-23 20:43:49
// 格式化模板: yyyy-MM-dd HH:mm:ss
// Go語言誕生的時間作為格式化模板:2006年1月2號下午3點(diǎn)4分5秒
// Go語言格式化時間的代碼:2006-01-02 15:04:05 (記憶方式:2006 12 345)
// 固定的:"2006-01-02 15:04:05"
now := time.Now()
// 24小時制
fmt.Println(now.Format("2006-01-02 15:04:05")) //2024-09-29 16:34:52
// 12小時制
fmt.Println(now.Format("2006-01-02 03:04:05 PM")) //2024-09-29 04:34:52 PM
// 自定義格式
fmt.Println(now.Format("Jan 2, 2006 at 3:04pm (MST)")) // Sep 29, 2024 at 4:34pm (CST)
fmt.Println(now.Format("2006/01/02 15:04")) // 2024/09/29 16:34
fmt.Println(now.Format("15:04 2006/01/02")) // 16:34 2024/09/29
fmt.Println(now.Format("2006/01/02")) // 2024/09/29
}

4. 解析時間字符串
time.Parse 和 time.ParseInLocation 函數(shù)可以將符合特定格式的字符串解析為 time.Time 對象。
Parse函數(shù)默認(rèn)使用本地時區(qū),而ParseInLocation允許指定時區(qū)。
4.1 基本解析
func Parse(layout, value string) (Time, error)
package main
import (
"fmt"
"time"
)
func main() {
const layout = "2006-01-02 15:04:05" //模板時間必須是這個
// 假設(shè)這是需要解析的時間字符串
const timeStr = "2023-09-10 12:34:56"
t, err := time.Parse(layout, timeStr)
if err != nil {
fmt.Println("Error parsing time:", err)
return
}
fmt.Println("Parsed time:", t)
}

加入我們模板時間用錯,解析報錯

4.2 帶時區(qū)的解析
如果時間字符串中包含時區(qū)信息,可以使用 time.ParseInLocation 進(jìn)行解析,并指定時區(qū)。
加載時區(qū)
func LoadLocation(name string) (*Location, error)
package main
import (
"fmt"
"time"
)
func main() {
// 假設(shè)這是需要解析的時間字符串,包含時區(qū)信息
const layout = "2006-01-02 15:04:05 MST"
const timeStr = "2023-09-10 12:34:56 CST"
// 加載時區(qū)
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println("Error loading location:", err)
return
}
t, err := time.ParseInLocation(layout, timeStr, loc)
if err != nil {
fmt.Println("Error parsing time:", err)
return
}
fmt.Println("Parsed time with location:", t)
}

5. 時間的計算
time 包提供了豐富的函數(shù)和方法來支持時間的計算,如時間的加減、時間間隔的計算等。
5.1 時間的加減
使用 time.Time 的 Add 方法可以在原有時間的基礎(chǔ)上加上或減去一定的時間間隔。
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// 加上一小時
oneHourLater := now.Add(time.Hour)
fmt.Println("One hour later:", oneHourLater)
// 減去一天
oneDayAgo := now.Add(-24 * time.Hour)
fmt.Println("One day ago:", oneDayAgo)
}

5.2 時間間隔的計算
time.Duration 類型代表兩個時間點(diǎn)之間經(jīng)過的時間,以納秒為單位??梢允褂?time.Time 的 Sub 方法來計算兩個時間點(diǎn)之間的時間間隔。
package main
import (
"fmt"
"time"
)
func main() {
start := time.Now()
// 假設(shè)這里有一些耗時操作
time.Sleep(2 * time.Second)
end := time.Now()
duration := end.Sub(start)
fmt.Println("Duration:", duration)
// 轉(zhuǎn)換為不同單位
hours := duration.Hours()
minutes := duration.Minutes()
seconds := duration.Seconds()
fmt.Printf("Duration in hours: %v\n", hours)
fmt.Printf("Duration in minutes: %v\n", minutes)
fmt.Printf("Duration in seconds: %v\n", seconds)
}

使用time.ParseDuration解析時間間隔字符串
d, _ := time.ParseDuration("1.2h")
fmt.Println("Parsed Duration:", d)

5.3 判斷時間先后
package main
import (
"fmt"
"time"
)
func main() {
t1 := time.Now()
t2 := t1.Add(time.Hour)
fmt.Println(t1)
fmt.Println(t2)
// 判斷時間先后
fmt.Println(t1.Before(t2)) // true
fmt.Println(t1.After(t2)) // false
fmt.Println(t1.Equal(t2)) // false
}

6. 時區(qū)處理
6.1 時區(qū)表示
在Go語言中,時區(qū)通過time.Location類型表示??梢允褂胻ime.LoadLocation函數(shù)加載一個時區(qū),或者使用time.FixedZone函數(shù)創(chuàng)建一個固定偏移量的時區(qū)。
package main
import (
"fmt"
"time"
)
func main() {
// 加載時區(qū)
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println("Error loading location:", err)
return
}
fmt.Println(loc)
// 創(chuàng)建固定偏移量的時區(qū)
beijing := time.FixedZone("Beijing Time", 8*3600)
fmt.Println(beijing)
}

6.2 時區(qū)轉(zhuǎn)換
在處理跨時區(qū)的時間時,可能需要將時間從一個時區(qū)轉(zhuǎn)換到另一個時區(qū)。這通常涉及到創(chuàng)建兩個時間對象,一個代表原始時間,另一個代表轉(zhuǎn)換后的時間,并指定不同的時區(qū)。
package main
import (
"fmt"
"time"
)
func main() {
// 原始時間(UTC)
utcTime := time.Date(2023, 9, 10, 12, 0, 0, 0, time.UTC)
fmt.Println("UTC Time:", utcTime)
// 轉(zhuǎn)換為北京時間
beijingLoc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Println("Error loading location:", err)
return
}
beijingTime := utcTime.In(beijingLoc)
fmt.Println("Beijing Time:", beijingTime)
}

7. 總結(jié)
Go 語言中的 time 包提供了強(qiáng)大的時間處理功能,包括時間的表示、計算、格式化和解析等。通過本文的詳細(xì)介紹和實際應(yīng)用案例,相信讀者已經(jīng)對 Go 語言中的時間處理有了更深入的了解。在實際編程中,合理利用 time 包的功能,可以大大簡化時間相關(guān)的操作,提高編程效率。
以上就是Go語言中時間time相關(guān)處理方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go時間time相關(guān)處理方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用Goland IDE go mod 方式構(gòu)建項目
這篇文章主要介紹了如何使用Goland IDE go mod 方式構(gòu)建項目,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10
關(guān)于golang中map使用的幾點(diǎn)注意事項總結(jié)(強(qiáng)烈推薦!)
map是一種無序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語言中的map是引用類型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點(diǎn)注意事項,需要的朋友可以參考下2023-01-01
Golang基于Vault實現(xiàn)敏感數(shù)據(jù)加解密
數(shù)據(jù)加密是主要的數(shù)據(jù)安全防護(hù)技術(shù)之一,敏感數(shù)據(jù)應(yīng)該加密存儲在數(shù)據(jù)庫中,降低泄露風(fēng)險,本文將介紹一下利用Vault實現(xiàn)敏感數(shù)據(jù)加解密的方法,需要的可以參考一下2023-07-07

