Go Time庫(kù)中時(shí)間和日期相關(guān)的操作方法整理
time庫(kù)
用于處理時(shí)間、日期和時(shí)區(qū)的核心庫(kù)。在實(shí)際開發(fā)中,常常需要與時(shí)間打交道,例如記錄日志、處理時(shí)間差、計(jì)算時(shí)間間隔等等。因此,掌握time庫(kù)的使用方法對(duì)于Go開發(fā)者來(lái)說(shuō)非常重要。
在Go語(yǔ)言中,時(shí)間表示為time.Time類型,日期表示為time.Time類型或者time.Date類型,時(shí)區(qū)表示為time.Location類型。下面將詳細(xì)介紹這些類型的概念及使用方法。
時(shí)間
在Go語(yǔ)言中,時(shí)間表示為time.Time類型。time.Time類型是一個(gè)結(jié)構(gòu)體,包含兩個(gè)字段:一個(gè)具有 century 和 second 等字段的大整數(shù)和一個(gè)小整數(shù),分別表示時(shí)間的年份和時(shí)間的小數(shù)部分。
可以使用time包中的函數(shù)來(lái)獲取當(dāng)前時(shí)間、指定時(shí)間或者進(jìn)行時(shí)間的加減操作。下面是一些常用的時(shí)間操作函數(shù):
- time.Now():返回當(dāng)前本地時(shí)間
- time.Parse(layout, str):將字符串str解析為指定格式layout的時(shí)間
- time.Add(d time.Duration):返回當(dāng)前時(shí)間加上給定時(shí)間間隔d的結(jié)果
- time.Sub(t, u time.Time):返回時(shí)間t減去時(shí)間u的時(shí)間間隔
日期
日期表示為time.Time類型或者time.Date類型。其中,time.Time類型表示完整的的時(shí)間,包括時(shí)分秒等信息;而time.Date類型則只表示日期部分,不包含時(shí)間部分。
可以使用time包中的函數(shù)來(lái)獲取指定日期的月份和日數(shù),或者進(jìn)行日期的加減操作。下面是一些常用的日期操作函數(shù):
- time.Month(month int):返回指定的月份的字符串表示
- time.Day():返回當(dāng)前日期中的天數(shù)
- time.AddDate(year int, month int, day int):返回指定年月日加上給定時(shí)間間隔的結(jié)果
- time.Sub(t, u time.Time):返回時(shí)間t減去時(shí)間u的時(shí)間間隔
時(shí)區(qū)
時(shí)區(qū)表示為time.Location類型。time.Location類型是一個(gè)結(jié)構(gòu)體,包含一個(gè)字符串表示時(shí)區(qū)的標(biāo)識(shí)符和一些字段,例如seconds 和 bias 等。
可以使用time包中的函數(shù)來(lái)獲取指定時(shí)區(qū)的偏移量或者進(jìn)行時(shí)區(qū)的轉(zhuǎn)換。下面是一些常用的時(shí)區(qū)操作函數(shù):
- time.Local:表示本地時(shí)區(qū)
- time.UTC:表示UTC時(shí)區(qū)
- time.LoadLocation(name string):返回指定時(shí)區(qū)名稱的time.Location類型對(duì)象
- time.In(loc time.Location, t time.Time):返回指定時(shí)區(qū)的時(shí)間t轉(zhuǎn)換為目標(biāo)時(shí)區(qū)loc的結(jié)果
函數(shù)
time.Now(): 返回當(dāng)前本地時(shí)間。
time.Parse(layout, str): 將字符串 str 解析為指定格式 layout 的時(shí)間。
time.Add(d time.Duration): 返回當(dāng)前時(shí)間加上給定時(shí)間間隔 d 的結(jié)果。
time.Sub(t, u time.Time): 返回時(shí)間 t 減去時(shí)間 u 的時(shí)間間隔。
time.Sub(t, u time.Time) time.Duration: 返回時(shí)間 t 減去時(shí)間 u 的時(shí)間間隔。
time.AddDate(years int, months int, days int) time.Time: 根據(jù)年、月、日的增量添加時(shí)間。
time.Since(t time.Time) time.Duration: 返回從 t 到現(xiàn)在的時(shí)間間隔。
time.Until(u time.Time) time.Duration: 返回從現(xiàn)在到 u 的時(shí)間間隔。
t.After(u):如果 t 在 u 之后,返回 true,否則返回 false。
t.Before(u):如果 t 在 u 之前,返回 true,否則返回 false。
time.Unix(sec int64, nanosec int64) time.Time: 將Unix時(shí)間戳轉(zhuǎn)換為時(shí)間對(duì)象。
time.ParseUnix(str string, layout string) (sec int64, nanosec int64,err error): 將時(shí)間字符串按照指定格式解析為Unix時(shí)間戳。
time.Set(sec int64, n int) time.Time: 將當(dāng)前時(shí)間設(shè)置為給定的秒數(shù)和納秒數(shù)。
time.Sleep(d Duration): 以讓程序在執(zhí)行過(guò)程中暫停一段時(shí)間。
time.Hour() int: 返回當(dāng)前小時(shí)的整數(shù)值。
time.Minute() int: 返回當(dāng)前分鐘的整數(shù)值。
time.Second() int: 返回當(dāng)前秒的整數(shù)值。
time.Nanosecond() int: 返回當(dāng)前納秒的整數(shù)值。
time.Weekday() time.Weekday: 返回當(dāng)前星期幾的枚舉值。
time.Day(): 返回當(dāng)前日期的日數(shù)。
time.Month() time.Month: 返回當(dāng)前月份的枚舉值。
time.Year() int: 返回當(dāng)前年份的整數(shù)值。
time.Date(year int, month time.Month, day, hour, min, sec, nanosec int, loc *time.Location) time.Time: 返回指定時(shí)間的本地時(shí)間對(duì)象。
time.isleap(year int) bool: 判斷給定的年份是否為閏年。
time.UnixNano() int64: 返回當(dāng)前時(shí)間的納秒值。
time.Duration() time.Duration: 返回從0時(shí)0分0秒到現(xiàn)在的納秒數(shù)。
time.ParseDuration(str string) (time.Duration, error): 將時(shí)間間隔字符串解析為時(shí)間間隔。
time.ParseInLocation(layout string, value string, loc *time.Location) (time.Time, error): 根據(jù)格式和時(shí)間值,解析時(shí)間,并指定時(shí)區(qū)。
time.StartOfDay(): 返回當(dāng)前日期的開始時(shí)間。
time.EndOfDay(): 返回當(dāng)前日期的結(jié)束時(shí)間。
time.StartOfWeek(): 返回當(dāng)前日期所在周的周一。
time.EndOfWeek(): 返回當(dāng)前日期所在周的周日。
time.StartOfMonth(): 返回當(dāng)前月份的開始時(shí)間。
time.EndOfMonth(): 返回當(dāng)前月份的結(jié)束時(shí)間。
time.StartOfYear(): 返回當(dāng)前年份的開始時(shí)間。
time.EndOfYear(): 返回當(dāng)前年份的結(jié)束時(shí)間。
time.Sunday: 返回星期幾的枚舉值,0為星期日,6為星期六,以此類推。
time.ParseDuration(str string) (time.Duration, error): 將時(shí)間間隔字符串解析為時(shí)間間隔。
time.Hour() time.Duration: 返回當(dāng)前小時(shí)的時(shí)間間隔。
time.Minute() time.Duration: 返回當(dāng)前分鐘的時(shí)間間隔。
time.Second() time.Duration: 返回當(dāng)前秒的時(shí)間間隔。
time.Nano() time.Duration: 返回當(dāng)前納秒的時(shí)間間隔。
time.ANSIC() string: 返回對(duì)應(yīng)于 ANSI C 的字符串表示的日期時(shí)間。
time.FixedZone(name string, offset int) *time.Location: 返回一個(gè)固定時(shí)區(qū)對(duì)象。
time.LoadLocation(name string) (*time.Location, error): 加載一個(gè)時(shí)區(qū)對(duì)象。
time.In(t time.Time, loc *time.Location) time.Time: 將時(shí)間 t 轉(zhuǎn)換為指定時(shí)區(qū)的時(shí)間。
類型
Time:表示時(shí)間點(diǎn),包括日期和時(shí)間。
Date:表示日期,包括年、月、日。
LocalTime:表示本地時(shí)間。
Location:表示時(shí)區(qū)。
ZeroTime:表示時(shí)間的零點(diǎn),即 1970 年 1 月 1 日 00:00:00 UTC。
Duration:它表示時(shí)間段,可以用納秒、微秒、毫秒、秒等為單位。
示例
代碼1
package main import ( "fmt" "time" ) func main() { // 獲取當(dāng)前時(shí)間 currentTime := time.Now() fmt.Println("Current Time:", currentTime) // 暫停程序執(zhí)行 5 秒鐘 fmt.Print("Waiting for 5 seconds: ") for i := 0; i < 5; i += 1 { time.Sleep(time.Second) fmt.Print(".") } fmt.Println() // 獲取指定日期的本地時(shí)間 year := 2023 month := time.March day := 17 hour := 0 minute := 0 second := 0 nano := 0 loc := &time.Location{} date := time.Date(year, month, day, hour, minute, second, nano, loc) fmt.Println("Date:", date) // 將時(shí)間字符串轉(zhuǎn)換為時(shí)間對(duì)象 layout := "2006-01-02 15:04:05" value := "2023-03-23 08:30:00" parsedTime, err := time.Parse(layout, value) if err != nil { fmt.Println("Error:", err) return } fmt.Println("Parsed Time:", parsedTime) // 格式化時(shí)間對(duì)象為字符串 format := "2006-01-02 15:04:05 MST" formattedTime := parsedTime.Format(format) fmt.Println("Formatted Time:", formattedTime) // 計(jì)算兩個(gè)時(shí)間之間的時(shí)間差 t2 := time.Now() diff := t2.Sub(parsedTime) fmt.Println("Time Difference:", diff) // 將時(shí)間對(duì)象轉(zhuǎn)換為UTC時(shí)區(qū) utcTime := parsedTime.UTC() fmt.Println("UTC Time:", utcTime) // 將時(shí)間對(duì)象轉(zhuǎn)換為本地時(shí)區(qū) localTime := parsedTime.In(time.Local) fmt.Println("Local Time:", localTime) }
輸出:
Current Time: 2023-08-01 20:15:11.0034059 +0800 CST
Waiting for 5 seconds: .....
Date: 2023-03-17 00:00:00 +0000 UTC
Parsed Time: 2023-03-23 08:30:00 +0000 UTC
Formatted Time: 2023-03-23 08:30:00 UTC
Time Difference: 3147h45m16.0065551s
UTC Time: 2023-03-23 08:30:00 +0000 UTC
Local Time: 2023-03-23 16:30:00 +0800 CST
代碼2
package main import ( "fmt" "time" ) func main() { // 解析時(shí)間字符串為時(shí)間對(duì)象 layout := "2006-01-02 15:04:05" strTime := "2023-03-23 12:30:00" t, err := time.Parse(layout, strTime) if err != nil { fmt.Println("時(shí)間解析錯(cuò)誤:", err) } fmt.Println("解析后的時(shí)間:", t) // 時(shí)間加減 d := time.Duration(24) * time.Hour t = t.Add(d) fmt.Println("加上一天的時(shí)間:", t) u := t.Add(-d) fmt.Println("減去一天的時(shí)間:", u) // 時(shí)間間隔 diff := t.Sub(u) fmt.Println("加上一天和減去一天的時(shí)間間隔:", diff) // 時(shí)間格式化輸出 layout = "2006-01-02" t = time.Now() formattedTime := t.Format(layout) fmt.Println("格式化后的時(shí)間:", formattedTime) // 時(shí)間轉(zhuǎn)換為Unix時(shí)間戳 unixTime := t.Unix() fmt.Println("Unix時(shí)間戳:", unixTime) // 時(shí)間比較 t1 := time.Now() t2 := t1.Add(time.Hour) diff = t2.Sub(t1) fmt.Println("t2 - t1 =", diff) fmt.Println("t1 < t2:", t1.Before(t2)) fmt.Println("t2 > t1:", t2.After(t1)) }
輸出:
解析后的時(shí)間: 2023-03-23 12:30:00 +0000 UTC
加上一天的時(shí)間: 2023-03-24 12:30:00 +0000 UTC
減去一天的時(shí)間: 2023-03-23 12:30:00 +0000 UTC
加上一天和減去一天的時(shí)間間隔: 24h0m0s
格式化后的時(shí)間: 2023-08-01
Unix時(shí)間戳: 1690892235
t2 - t1 = 1h0m0s
t1 < t2: true
t2 > t1: true
總結(jié)
本文介紹了Go語(yǔ)言中的time庫(kù),包括時(shí)間、日期和時(shí)區(qū)等相關(guān)概念及使用方法。通過(guò)掌握這些知識(shí),可以更好地處理時(shí)間、日期和時(shí)區(qū)相關(guān)的問(wèn)題,提高開發(fā)效率。
到此這篇關(guān)于Go Time庫(kù)中時(shí)間和日期相關(guān)的操作方法整理的文章就介紹到這了,更多相關(guān)Go Time內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Go語(yǔ)言中時(shí)間time相關(guān)處理方法詳解
- go?time.Sleep睡眠指定時(shí)間實(shí)例詳解(小時(shí)級(jí)到納秒級(jí))
- golang中time包之時(shí)間間隔格式化和秒、毫秒、納秒等時(shí)間戳格式輸出的方法實(shí)例
- 解決golang時(shí)間字符串轉(zhuǎn)time.Time的坑
- golang time包做時(shí)間轉(zhuǎn)換操作
- golang的time包:秒、毫秒、納秒時(shí)間戳輸出方式
- golang 使用time包獲取時(shí)間戳與日期格式化操作
- django 中使用DateTime常用的時(shí)間查詢方式
- Go語(yǔ)言時(shí)間管理利器之深入解析time模塊的實(shí)戰(zhàn)技巧
相關(guān)文章
淺析Go中fasthttp與net/http的性能對(duì)比及應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Golang中fasthttp的底層實(shí)現(xiàn)以及與net/http的區(qū)別,下面就跟隨小編一起來(lái)看看fasthttp到底是如何做到性能如此之快的吧2024-03-03golang實(shí)現(xiàn)http server提供文件下載功能
這篇文章主要介紹了golang實(shí)現(xiàn)http server提供文件下載功能,本文給大家簡(jiǎn)單介紹了Golang的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Golang中函數(shù)(Function)和方法(Method)的區(qū)別詳解
在Golang中,大家必然會(huì)頻繁使用到函數(shù)(Function)和方法(Method),但是有的同學(xué)可能并沒(méi)有注意過(guò)函數(shù)和方法的異同點(diǎn),函數(shù)和方法都是用來(lái)執(zhí)行特定任務(wù)的代碼塊,雖然很相似,但也有很大的區(qū)別,所以本文將詳細(xì)講解函數(shù)和方法的定義以及它們的異同點(diǎn)2023-07-07Go和Java算法詳析之分?jǐn)?shù)到小數(shù)
這篇文章主要給大家介紹了關(guān)于Go和Java算法詳析之分?jǐn)?shù)到小數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-08-08深度剖析Golang如何實(shí)現(xiàn)GC掃描對(duì)象
這篇文章主要為大家詳細(xì)介紹了Golang是如何實(shí)現(xiàn)GC掃描對(duì)象的,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考一下2023-03-03