Go語言基礎(chǔ)之Time包詳解
前言
一寸光陰一寸金,時間難買寸光陰,時間,是個多么重要的東西。
同樣,在我們的編程中,時間也依然占據(jù)著很大的一部分。
就像淘寶,客戶下單需要記錄時間,發(fā)貨了需要記錄時間,保質(zhì)期多久需要推算時間,等等等等。
那我們一起來看看Go中是如何操作時間叭!
time.Now()
time.Now()返回的是一個Time類型。
相關(guān)代碼如下
- func main() {
- var nowTime = time.Now()
- fmt.Println(nowTime)
- var year = nowTime.Year() //當(dāng)前年份
- var month = nowTime.Month() //當(dāng)前月份
- var day = nowTime.Day() //今天幾號
- var hour = nowTime.Hour() //現(xiàn)在幾時
- var Minute = nowTime.Minute() //現(xiàn)在幾分
- var second = nowTime.Second() //現(xiàn)在幾秒
- fmt.Printf("當(dāng)前年份:%v\n",year)
- fmt.Printf("當(dāng)前月份:%v\n",month)
- fmt.Printf("幾號了:%v\n",day)
- fmt.Printf("幾時:%v\n",hour)
- fmt.Printf("幾分:%v\n",Minute)
- fmt.Printf("幾秒:%v\n",second)
- }
執(zhí)行結(jié)果
時間戳
時間戳:從北京時間1970年1月1日8點(diǎn)到現(xiàn)在時間的秒數(shù),是一個int64類型。
相關(guān)代碼
- func main() {
- var nowTime = time.Now()
- var timestampSecond = nowTime.Unix()
- fmt.Println(timestampSecond)
- }
執(zhí)行結(jié)果
到目前為止已經(jīng)有1603698727秒了,時間不等人吶!
納秒時間戳
一般情況下我們使用的都是秒,但是時間戳還可以返回成納秒,用的不多,了解就好。
代碼
- func main() {
- var nowTime = time.Now()
- var timestampNano = nowTime.UnixNano()
- fmt.Println(timestampNano)
- }
執(zhí)行結(jié)果
時間戳轉(zhuǎn)Time
有時候別人給我們的是時間戳,我們需要反著轉(zhuǎn)以下,時間戳->時間類型。
需要用到的是time.Unix。
代碼
- func main() {
- //時間戳
- var timestampSecond int64 = 1603698727
- //轉(zhuǎn)換為time對象
- var timeObj = time.Unix(timestampSecond, 0)
- var year = timeObj.Year() //當(dāng)前年份
- var month = timeObj.Month() //當(dāng)前月份
- var day = timeObj.Day() //今天幾號
- var hour = timeObj.Hour() //現(xiàn)在幾時
- var Minute = timeObj.Minute() //現(xiàn)在幾分
- var second = timeObj.Second() //現(xiàn)在幾秒
- fmt.Printf("年份:%v\n", year)
- fmt.Printf("月份:%v\n", month)
- fmt.Printf("幾號:%v\n", day)
- fmt.Printf("幾時:%v\n", hour)
- fmt.Printf("幾分:%v\n", Minute)
- fmt.Printf("幾秒:%v\n", second)
- }
執(zhí)行效果
時間+
很多時候,我們拿到一個時間,我們需要向前或者向后推算一個月,或者幾個小時,這就屬于時間+。
在Go中,時間推算有倆函數(shù),一個是Add,一個是AddDate,分別是+小時和+天數(shù)。
Add
代碼
Add最大單位是小時,只能+小時
- func main() {
- //當(dāng)前時間
- nowTime := time.Now()
- fmt.Println("當(dāng)前時間:",nowTime)
- time1 := nowTime.Add(time.Hour)
- fmt.Println("加一個小時時間:", time1)
- time2 := nowTime.Add( time.Hour*2)
- fmt.Println("加二個小時時間:", time2)
- }
執(zhí)行結(jié)果
AddDate
AddDate就牛逼很多了,有三個參數(shù),分別是年,月,日,根據(jù)需求加就行了。
代碼
- func main() {
- //當(dāng)前時間
- nowTime := time.Now()
- fmt.Println("當(dāng)前時間:",nowTime)
- month1 := nowTime.AddDate(0, 1, 1)
- fmt.Println("加一個月時間:", month1)
- month2 := nowTime.AddDate(0, 2, 1)
- fmt.Println("加二個月時間:", month2)
- }
執(zhí)行結(jié)果
注意:上述不僅可以時間+,還可以時間-,前面加負(fù)號就可以了。
Sub
Sub通常用在計算某一段代碼執(zhí)行用了多久時間,最后時間-最開始時間=執(zhí)行時間。
代碼
- func main() {
- //當(dāng)前時間
- beginTime := time.Now()
- //各種操作
- time.Sleep(time.Second)
- //結(jié)束時間
- end_time := time.Now()
- //計算時間
- execTime := end_time.Sub(beginTime)
- fmt.Println("執(zhí)行時間:", execTime)
- }
執(zhí)行結(jié)果
定時器
默認(rèn)的定時器挺Low的,只有最簡單的功能,了解就好。
示例:每隔一秒執(zhí)行次相關(guān)代碼。
代碼
- func main() {
- ticker := time.Tick(time.Second)
- for i := range ticker {
- fmt.Println(i)
- }
- }
執(zhí)行結(jié)果
時間格式化(time -> string)
Go語言的時間格式化,有點(diǎn)逗,跟其他語言都不一樣,沒有%Y,%M之類的寫法。
記住一個時間2006-01-02 15:04:05.000 Mon Jan/PM Mon Jan。
分別對應(yīng)年-月-日 時:分:秒 24/12。
當(dāng)前,同其語言一樣,可以只格式化年-月-日等。
格式時間需要用到Format方法。
代碼
- func main() {
- now := time.Now()
- //年 月 日 時 分 秒
- fmt.Println(now.Format("2006-01-02 15:04:05"))
- //24小時
- fmt.Println(now.Format("2006-01-02 15:04:05 Mon Jan"))
- //12小時
- fmt.Println(now.Format("2006-01-02 15:04:05 PM Mon Jan"))
- //年月日
- fmt.Println(now.Format("2006-01-02"))
- }
執(zhí)行結(jié)果
字符串格式化時間(string -> time)
將拿到的時間字符串轉(zhuǎn)成時間類型。
代碼
- func main() {
- //時間字符串
- timeString := "2020/09/01 14:01:45"
- //加載時區(qū),亞洲/上海
- location, err := time.LoadLocation("Asia/Shanghai")
- if err != nil {
- fmt.Println("時區(qū)加載失敗,", err)
- return
- }
- timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", timeString, location)
- if err != nil {
- fmt.Println("時間轉(zhuǎn)換失敗,", err)
- return
- }
- fmt.Println(timeObj)
- }
執(zhí)行結(jié)果
總結(jié)
到這終于結(jié)束了,關(guān)于Go時間的操作基本就上述這么多。
當(dāng)然,這是自帶的包的功能有這么多,對于平常使用基本夠用。
其實主要重要的是Add和AddDate,時間 -> 格式化字符串,字符串 -> 時間,這些在平常中使用頻率最高。
如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。
如果你覺得文章還可以,記得點(diǎn)贊留言支持我們哈。感謝你的閱讀,有問題請記得在下方留言噢~
本文轉(zhuǎn)載自微信公眾號「Go語言進(jìn)階學(xué)習(xí)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Go語言進(jìn)階學(xué)習(xí)公眾號。