Go時(shí)間操作常用方法(推薦!)
1. time 包
1.1. 時(shí)間類型
Go 語(yǔ)言中時(shí)間類型有兩種:
- time.Time:表示時(shí)間的類型,常見(jiàn)的有兩種方式:
- time.Now():獲取當(dāng)前的時(shí)間
- time.Date():根據(jù)指定的年、月、日、時(shí)、分、秒、納秒等創(chuàng)建時(shí)間
- time.Duration:表示兩個(gè)時(shí)間點(diǎn)之間經(jīng)過(guò)的時(shí)間,以納秒為單位
1.2. 時(shí)間戳
時(shí)間戳是自 1970 年 1 月 1 日(08:00:00GMT)至當(dāng)前時(shí)間的總毫秒數(shù)。它也被稱為 Unix 時(shí)間戳(UnixTimestamp)。
1.3. 時(shí)間間隔
time.Duration 是 time 包定義的一個(gè)類型,它代表兩個(gè)時(shí)間點(diǎn)之間經(jīng)過(guò)的時(shí)間,以納秒為單位。time.Duration 表示一段時(shí)間間隔,可表示的最長(zhǎng)時(shí)間段大約 290 年。
1.4. 時(shí)間操作
Go 語(yǔ)言中時(shí)間操作主要有兩種:
- 獲取時(shí)間:time.Now()、time.Date()
- 格式化時(shí)間:time.Format()、time.Parse()
2. 獲取時(shí)間
2.1. 獲取當(dāng)前時(shí)間
Go 語(yǔ)言中通過(guò) time.Now()函數(shù)獲取當(dāng)前時(shí)間,返回一個(gè) time.Time 類型的本地時(shí)間。
func Now() Time
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now() // 獲取當(dāng)前時(shí)間
fmt.Printf("current time:%v\n", now)
}2.2. 獲取指定時(shí)間
time.Date()函數(shù)可以獲取指定的時(shí)間,其參數(shù)分別是:年、月、日、時(shí)、分、秒、納秒、時(shí)區(qū)。
func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time
package main
import (
"fmt"
"time"
)
func main() {
// 獲取指定時(shí)間
date := time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local)
fmt.Printf("date:%v\n", date)
}
3. 格式化時(shí)間
3.1. 時(shí)間類型轉(zhuǎn)字符串
Go 語(yǔ)言中可以通過(guò) time.Time 類型的 Format()函數(shù)對(duì)時(shí)間進(jìn)行格式化,該函數(shù)的第一個(gè)參數(shù)是格式化的模板,模板里面的時(shí)間必須是 2006-01-02 15:04:05 這個(gè)時(shí)間,這個(gè)時(shí)間是固定的,不然就會(huì)出錯(cuò),第二個(gè)參數(shù)是要格式化的時(shí)間。
func (t Time) Format(layout string) string
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now() // 獲取當(dāng)前時(shí)間
// 格式化的模板為Go的出生時(shí)間2006年1月2號(hào)15點(diǎn)04分 Mon Jan
fmt.Println(now.Format("2006-01-02 15:04:05.000 Mon Jan"))
fmt.Println(now.Format("2006/01/02 15:04"))
fmt.Println(now.Format("15:04 2006/01/02"))
}
3.2. 字符串轉(zhuǎn)時(shí)間類型
Go 語(yǔ)言中可以通過(guò) time.Parse()函數(shù)對(duì)字符串進(jìn)行解析,生成對(duì)應(yīng)的 time.Time 類型的時(shí)間。
func Parse(layout, value string) (Time, error)
package main
import (
"fmt"
"time"
)
func main() {
// 加載時(shí)區(qū)
loc, _ := time.LoadLocation("Asia/Shanghai")
// 按照指定時(shí)區(qū)和指定格式解析字符串時(shí)間
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)
if err != nil {
fmt.Printf("parse time failed, err:%v\n", err)
return
}
fmt.Println(timeObj)
}
4. 時(shí)間常量
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)5. 時(shí)間操作
5.1. 獲取時(shí)間戳
時(shí)間戳是自 1970 年 1 月 1 日(08:00:00GMT)至當(dāng)前時(shí)間的總毫秒數(shù)。它也被稱為 Unix 時(shí)間戳(UnixTimestamp)。
func (t Time) Unix() int64
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
timestamp1 := now.Unix() // 時(shí)間戳
timestamp2 := now.UnixNano() // 納秒時(shí)間戳
fmt.Printf("current timestamp1:%v\n", timestamp1)
fmt.Printf("current timestamp2:%v\n", timestamp2)
}
5.2. 時(shí)間間隔
time.Duration 是 time 包定義的一個(gè)類型,它代表兩個(gè)時(shí)間點(diǎn)之間經(jīng)過(guò)的時(shí)間,以納秒為單位。time.Duration 表示一段時(shí)間間隔,可表示的最長(zhǎng)時(shí)間段大約 290 年。
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
// 程序執(zhí)行到這里會(huì)暫停2秒
time.Sleep(2 * time.Second)
fmt.Println("2 seconds later")
// 兩個(gè)時(shí)間相減
fmt.Printf("passed %v\n", time.Since(now))
}
5.3. 定時(shí)器
time.Timer 類型表示單次時(shí)間事件。當(dāng)定時(shí)器到期時(shí),當(dāng)前時(shí)間會(huì)被發(fā)送給 C,除非定時(shí)器是被 AfterFunc 函數(shù)創(chuàng)建的。因此,如果程序持有定時(shí)器的唯一引用,當(dāng)定時(shí)器觸發(fā)時(shí),它會(huì)被釋放,并停止定時(shí)器。
func AfterFunc(d Duration, f func()) *Timer
package main
import (
"fmt"
"time"
)
func main() {
timer := time.Tick(time.Second) // 定義一個(gè)1秒間隔的定時(shí)器
for t := range timer {
fmt.Println(t) // 1秒鐘執(zhí)行一次
}
}
5.4. 定時(shí)器
time.Ticker 類型代表一個(gè)間隔觸發(fā)的時(shí)間事件,它會(huì)以一個(gè)間隔(例如,1 秒、1 分鐘等)觸發(fā)多次,發(fā)送一個(gè)事件給一個(gè)通道。
func Tick(d Duration) *Ticker
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second) // 定義一個(gè)1秒間隔的定時(shí)器
for t := range ticker.C {
fmt.Println(t) // 1秒鐘執(zhí)行一次
}
}
6. 時(shí)區(qū)
Go 語(yǔ)言中通過(guò) LoadLocation()函數(shù)加載時(shí)區(qū)信息,它的參數(shù)是時(shí)區(qū)的名字。時(shí)區(qū)信息我們可以通過(guò) time 包中的 LoadLocation(name string) (*Location, error)函數(shù)獲取,它返回一個(gè) Location 對(duì)象,然后我們就可以通過(guò) LoadLocation()函數(shù)加載時(shí)區(qū)信息了。
func LoadLocation(name string) (*Location, error)
package main
import (
"fmt"
"time"
)
func main() {
// 加載時(shí)區(qū)
loc, err := time.LoadLocation("Asia/Shanghai")
if err != nil {
fmt.Printf("load location failed, err:%v\n", err)
return
}
// 按照指定時(shí)區(qū)和指定格式解析字符串時(shí)間
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)
if err != nil {
fmt.Printf("parse time failed, err:%v\n", err)
return
}
fmt.Println(timeObj)
}
7. 時(shí)區(qū)轉(zhuǎn)換
func (t Time) In(loc *Location) Time
package main
import (
"fmt"
"time"
)
func main() {
// 加載時(shí)區(qū)
loc, _ := time.LoadLocation("Asia/Shanghai")
// 按照指定時(shí)區(qū)和指定格式解析字符串時(shí)間
timeObj, err := time.ParseInLocation("2006/01/02 15:04:05", "2020/01/01 00:00:00", loc)
if err != nil {
fmt.Printf("parse time failed, err:%v\n", err)
return
}
fmt.Println(timeObj)
// 按照東八區(qū)的時(shí)區(qū)和格式去解析字符串時(shí)間
timeObj, err = time.Parse("2006/01/02 15:04:05", "2020/01/01 00:00:00")
if err != nil {
fmt.Printf("parse time failed, err:%v\n", err)
return
}
fmt.Println(timeObj)
// 將timeObj轉(zhuǎn)換到指定時(shí)區(qū)
newTime := timeObj.In(loc)
fmt.Println(newTime)
}
總結(jié)
到此這篇關(guān)于Go時(shí)間操作常用方法的文章就介紹到這了,更多相關(guān)Go時(shí)間操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn)
本文主要介紹了Go微服務(wù)網(wǎng)關(guān)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std解決辦法
這篇文章主要給大家介紹了go引入自建包名報(bào)錯(cuò):package?XXX?is?not?in?std的解決辦法,這是在寫測(cè)試引入包名的時(shí)候遇到的錯(cuò)誤提示,文中將解決辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Golang?pprof監(jiān)控之cpu占用率統(tǒng)計(jì)原理詳解
經(jīng)過(guò)前面的幾節(jié)對(duì)pprof的介紹,對(duì)pprof統(tǒng)計(jì)的原理算是掌握了七八十了,但唯獨(dú)還沒(méi)有分析pprof?工具是如何統(tǒng)計(jì)cpu使用情況的,今天我們來(lái)分析下這部分2023-04-04
go-zero源碼閱讀之布隆過(guò)濾器實(shí)現(xiàn)代碼
布隆過(guò)濾器可以用于檢索一個(gè)元素是否在一個(gè)集合中。它的優(yōu)點(diǎn)是空間效率和查詢時(shí)間都比一般的算法要好的多,缺點(diǎn)是有一定的誤識(shí)別率和刪除困難,這篇文章主要介紹了go-zero源碼閱讀-布隆過(guò)濾器,需要的朋友可以參考下2023-02-02
一文帶你了解Golang中reflect反射的常見(jiàn)錯(cuò)誤
go?反射的錯(cuò)誤大多數(shù)都來(lái)自于調(diào)用了一個(gè)不適合當(dāng)前類型的方法,?而且,這些錯(cuò)誤通常是在運(yùn)行時(shí)才會(huì)暴露出來(lái),而不是在編譯時(shí),如果我們傳遞的類型在反射代碼中沒(méi)有被覆蓋到那么很容易就會(huì)?panic。本文就介紹一下使用?go?反射時(shí)很大概率會(huì)出現(xiàn)的錯(cuò)誤,需要的可以參考一下2023-01-01
Golang WaitGroup實(shí)現(xiàn)原理解析
WaitGroup是Golang并發(fā)的兩種方式之一,一個(gè)是Channel,另一個(gè)是WaitGroup,下面這篇文章主要給大家介紹了關(guān)于golang基礎(chǔ)之waitgroup用法以及使用要點(diǎn)的相關(guān)資料,需要的朋友可以參考下2023-02-02

