Go語(yǔ)言時(shí)間相關(guān)操作合集(超詳細(xì))
在我們開(kāi)發(fā)應(yīng)用程序的過(guò)程中,經(jīng)常需要記錄某些操作的時(shí)間或者格式化時(shí)間戳,因此大部分編程語(yǔ)言都會(huì)有操作時(shí)間的庫(kù),Go
語(yǔ)言當(dāng)然也不例外。
Go
語(yǔ)言對(duì)時(shí)間的操作能力集中標(biāo)準(zhǔn)庫(kù)time
包里,所以在這篇文章中,我們一起來(lái)學(xué)習(xí)time
包的使用。
獲取當(dāng)前時(shí)間
在Go語(yǔ)言中,要獲取當(dāng)前的時(shí)間非常簡(jiǎn)單,只要調(diào)用time
包的Now()
函數(shù)即可:
fmt.Println(time.Now())
上面代碼的輸出結(jié)果是:
2023-06-16 09:44:58.726134 +0800 CST m=+0.000151257
上面結(jié)果的各部分意義是:
2023-06-06
:表示日期09:44:58.726134
:表示時(shí)間+0800 CST
:時(shí)區(qū),這里是指東八區(qū)m=+0.000151257
:?jiǎn)握{(diào)時(shí)間,用于表示兩個(gè)時(shí)間點(diǎn)的長(zhǎng)度。
時(shí)間戳與時(shí)區(qū)
時(shí)區(qū)
地球上各個(gè)地區(qū)因?yàn)榻?jīng)度的不同被劃分為24個(gè)時(shí)區(qū),這24個(gè)時(shí)區(qū)以零時(shí)區(qū)(中時(shí)區(qū))開(kāi)始劃分為東西各12
個(gè)時(shí)區(qū),相鄰兩個(gè)時(shí)區(qū)之間相差一個(gè)小時(shí),其計(jì)算規(guī)則是向東每跨過(guò)一個(gè)時(shí)區(qū)增加1個(gè)小時(shí),向西每跨一個(gè)時(shí)間減去1個(gè)小時(shí):
假設(shè)此時(shí)零時(shí)區(qū)是上午9:00
的話(huà),那么其他各個(gè)時(shí)區(qū)的時(shí)間根據(jù)所在時(shí)區(qū)會(huì)有所不同,下面表格列舉了幾個(gè)時(shí)區(qū)的時(shí)間:
西七區(qū)(加里福利亞州) | 西五區(qū)(紐約) | 西四區(qū)(圣地亞哥) | 零時(shí)區(qū) | 泰國(guó)(東7區(qū)) | 中國(guó)(東八區(qū)) | 日本(東九區(qū)) |
---|---|---|---|---|---|---|
1:00 | 4:00 | 7:00 | 9:00 | 16:00 | 17:00 | 18:00 |
世界標(biāo)準(zhǔn)時(shí)間的縮寫(xiě)為UTC
,UTC
也表示零時(shí)區(qū),如果我們想表示某個(gè)時(shí)區(qū)的話(huà),比如東八區(qū),其寫(xiě)法為UTC+8
,西五區(qū)則為UTC-5
。
另外,時(shí)區(qū)一般有自己的縮寫(xiě),比如PRC
表示中國(guó)標(biāo)準(zhǔn)時(shí)間,Asia/Shanghai
也是指中國(guó)時(shí)間,也就是說(shuō)PRC
、Asia/Shanghai
與UTC+8
都是表示東八區(qū)的中國(guó)時(shí)間。
時(shí)間戳
時(shí)間戳
是指以格林尼治1970年1月1日 00:00:00為起點(diǎn)的秒數(shù),時(shí)間戳不受時(shí)區(qū)的影響,所在在地球上任何一個(gè)地方在某一時(shí)刻獲得的時(shí)間戳都是一樣的。
在Go
語(yǔ)言中,要獲得當(dāng)前時(shí)間戳也非常簡(jiǎn)單:
fmt.Println(time.Now().Unix())
time.Time
Time
前面我們通過(guò)time.Now()
獲取當(dāng)前時(shí)間,實(shí)際上該函數(shù)返回一個(gè)time
包下的Time
結(jié)構(gòu)體,Time
結(jié)構(gòu)體表示一個(gè)時(shí)間對(duì)象,大部分操作時(shí)間的功能都集中在這個(gè)結(jié)構(gòu)體中:
time.Now().Year()?//獲取當(dāng)前年份 time.Now().Month()?//獲取當(dāng)前月份
時(shí)間格式規(guī)則
有了表示時(shí)間的對(duì)象后,如果想按照我們想要的格式輸出可以調(diào)用Time
的Format()
方法,如果你接觸過(guò)其他編程語(yǔ)言(比如PHP
),這時(shí)可能會(huì)覺(jué)得需要給Format()
傳進(jìn)入類(lèi)似下面的參數(shù):
Y-m-d H:i:s
在上面給出的格式中,Y
表示年份,m
表示月份,d
表示日期,H
表示小時(shí),i
表示分鐘,s
表示秒。
在其他編程語(yǔ)言中,使用以上格式進(jìn)行時(shí)間格式化處理,會(huì)得到下面這樣的日期:
2023-06-18 18:32:30
不過(guò)在Go語(yǔ)言中,要想將得到同樣的結(jié)果,你需要這樣做:
time.Now().Format("2006-01-02?15:04:05")
上面的代碼的運(yùn)行結(jié)果同樣是:
2023-06-18 18:32:30
從上面的格式可以看出2006-01-02 15:04:05
相當(dāng)于其他編程語(yǔ)言的Y-m-d H:i:s
,這就是Go語(yǔ)言在時(shí)間處理方面與其他編程語(yǔ)言的差異。
Go語(yǔ)言格式化時(shí)間的規(guī)則如下表格所示:
格式 | 說(shuō)明 |
---|---|
2006或者06 | 年 |
January或01或1 | 月 |
Mon或者M(jìn)onday | 星期 |
2或_2或者02 | 日期 |
__2或002 | 一年中的第幾天 |
15或3或03 | 小時(shí) |
4或04 | 分鐘 |
5或05 | 秒 |
PM | AM/PM |
-0700 | 時(shí)區(qū),±hhmm |
-07:00 | 時(shí)區(qū),±hh:mm |
-07 | 時(shí)區(qū),±hh |
-070000 | 時(shí)區(qū), ±hhmmss |
-07:00:00 | 時(shí)區(qū), ±hh:mm:ss |
因此,如果我們想把當(dāng)前時(shí)間按下面的時(shí)間格式顯示的話(huà):
年-月-日 時(shí):分:秒 星期幾 時(shí)區(qū)
我們的代碼需要這樣寫(xiě):
time.Now().Format("2006-01-02?15:04:05?Monday?-0700")
其實(shí),如果總是需要自己寫(xiě)上面的格式字符串也很麻煩,因此time
包下定義了很多常量,可以直接調(diào)用:
Layout??????=?"01/02?03:04:05PM?'06?-0700"? ANSIC???????=?"Mon?Jan?_2?15:04:05?2006" UnixDate????=?"Mon?Jan?_2?15:04:05?MST?2006" RubyDate????=?"Mon?Jan?02?15:04:05?-0700?2006" RFC822??????=?"02?Jan?06?15:04?MST" RFC822Z?????=?"02?Jan?06?15:04?-0700"? RFC850??????=?"Monday,?02-Jan-06?15:04:05?MST" RFC1123?????=?"Mon,?02?Jan?2006?15:04:05?MST" RFC1123Z????=?"Mon,?02?Jan?2006?15:04:05?-0700" RFC3339?????=?"2006-01-02T15:04:05Z07:00" RFC3339Nano?=?"2006-01-02T15:04:05.999999999Z07:00" Kitchen?????=?"3:04PM" Stamp??????=?"Jan?_2?15:04:05" StampMilli?=?"Jan?_2?15:04:05.000" StampMicro?=?"Jan?_2?15:04:05.000000" StampNano??=?"Jan?_2?15:04:05.000000000" DateTime???=?"2006-01-02?15:04:05" DateOnly???=?"2006-01-02" TimeOnly???=?"15:04:05"
Date
如果不是想獲取當(dāng)前時(shí)間,而是要指定某個(gè)時(shí)間,可以調(diào)用Date()
函數(shù)構(gòu)建一個(gè)指定日期Time
對(duì)象,Date()
函數(shù)的簽名如下:
func?Date(year?int,?month?Month,?day,?hour,?min,?sec,?nsec?int,?loc?*Location)?Time
可以看到,調(diào)用函數(shù)Date()
需要的參數(shù)可以精確到納秒:
fmt.Println(time.Date(2023,?time.Month(1),?2,?2,?2,?2,?0,?time.Local))
Parse
有時(shí)候我們接收用戶(hù)與時(shí)間相關(guān)請(qǐng)求參數(shù)時(shí),得到往往是一個(gè)時(shí)間格式的字符串,比如2023-06-02 10:00:00
:
t,?_?:=?time.Parse(time.DateTime,?"2023-06-02?10:00:00") fmt.Println(t.Unix())
格式化時(shí)間戳
通常我們都是以時(shí)間戳的形式將時(shí)間保存在數(shù)據(jù)庫(kù)中,當(dāng)需要展示給用戶(hù)時(shí),則需要將時(shí)間戳格式化,Go語(yǔ)言支持秒,毫秒,微秒等時(shí)間戳的格式:
t?:=?time.Unix(1685700000,?0) fmt.Println(t.Format(time.DateTime))
按時(shí)區(qū)顯示時(shí)間
有時(shí)候我們需要根據(jù)用戶(hù)所在時(shí)區(qū)顯示對(duì)應(yīng)的時(shí)間,在time
包里,用Location
結(jié)構(gòu)體表示一個(gè)時(shí)區(qū)對(duì)象,可以使用time
包的LoadLocation()
函數(shù)加載本地預(yù)先定義的時(shí)區(qū)數(shù)據(jù)
loc1,?err?:=?time.LoadLocation("Asia/Shanghai") loc2,?err?:=?time.LoadLocation("PRC")
也可以使用FixeZone
函數(shù)自己定義一個(gè)時(shí)區(qū)名稱(chēng):
?beijing?:=?time.FixedZone("Beijing",?+8*60*60)
有了Location
對(duì)象,我們可以將顯示不同時(shí)區(qū)的時(shí)間:
package?main import?( ?"fmt" ?"time" ) func?main()?{ ?ch,?_?:=?time.LoadLocation("PRC") ?t?:=?time.Date(2023,?time.June,?19,?11,?43,?0,?0,?ch) ?fmt.Println("中國(guó)時(shí)間是:",?t) ?jp?:=?time.FixedZone("jp",?+(9?*?60?*?60)) ?t2?:=?t.In(jp) ?fmt.Println("日本時(shí)間是:",?t2) }
time.Duration
如果要比較兩個(gè)時(shí)刻之間的時(shí)間長(zhǎng)度,可以調(diào)用Time的Sub
方法,這個(gè)函數(shù)可以計(jì)算兩個(gè)時(shí)刻的長(zhǎng)度,并返回一個(gè)表示時(shí)間段的Duration
結(jié)構(gòu)體:
package?main import?( ?"fmt" ?"time" ) func?main()?{ ?t1,?_?:=?time.Parse(time.DateTime,?"2023-06-01?16:00:00") ?t2,?_?:=?time.Parse(time.DateTime,?"2023-06-02?16:00:00") ?d?:=?t2.Sub(t1) ?fmt.Println(d) }
上面例子運(yùn)行結(jié)果為:
24h0m0s
當(dāng)我們想在某個(gè)時(shí)刻上疊加一個(gè)時(shí)間段時(shí),也可以調(diào)用time包的ParseDuration()
函數(shù)構(gòu)建一個(gè)Duration
結(jié)構(gòu)體并傳給Time
結(jié)構(gòu)體的Add()
方法。
ParseDuration()
函數(shù)的參數(shù)為一個(gè)表示時(shí)間段的字符串,比如1h
,2days
:
package?main import?( ?"fmt" ?"time" ) func?main()?{ ?d,?_?:=?time.ParseDuration("4h") ?t?:=?time.Now().Add(d) ?fmt.Println(t) }
小結(jié)
Go
的標(biāo)準(zhǔn)庫(kù)time
包提供了完整操作對(duì)時(shí)間的格式式和測(cè)量等功能,雖然用法與其他編程語(yǔ)言稍有差異,但是也非常容易掌握。
以上就是Go語(yǔ)言時(shí)間相關(guān)操作合集(超詳細(xì))的詳細(xì)內(nèi)容,更多關(guān)于Go時(shí)間操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang使用viper加載配置文件實(shí)現(xiàn)自動(dòng)反序列化到結(jié)構(gòu)
這篇文章主要為大家介紹了golang使用viper加載配置文件實(shí)現(xiàn)自動(dòng)反序列化到結(jié)構(gòu)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇golang socket斷點(diǎn)續(xù)傳大文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟
本文主要介紹了Go數(shù)據(jù)庫(kù)遷移的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Golang標(biāo)準(zhǔn)庫(kù)time包日常用法小結(jié)
本文主要介紹了Golang標(biāo)準(zhǔn)庫(kù)time包日常用法小結(jié),可以通過(guò)它們來(lái)獲取當(dāng)前時(shí)間、創(chuàng)建指定時(shí)間、解析時(shí)間字符串、控制時(shí)間間隔等操作,感興趣的可以了解一下2023-11-11Golang中String,rune和byte的相互轉(zhuǎn)換
Go語(yǔ)言中,string就是只讀的采用utf8編碼的字節(jié)切片,rune是int32的別名,代表字符的Unicode編碼,這篇文章主要介紹了Golang中String,rune和byte的相互轉(zhuǎn)換,感興趣的小伙伴可以了解一下2023-10-10Go基礎(chǔ)教程系列之defer、panic和recover詳解
這篇文章主要介紹了Go基礎(chǔ)教程系列之defer、panic和recover,需要的朋友可以參考下2022-04-04