在 Time 包中,定義有一個(gè)名為 Duration 的類型和一些輔助的常量:
type Duration int64
const (
Nanosecond Duration = 1
Microsecond = 1000 * Nanosecond
Millisecond = 1000 * Microsecond
Second = 1000 * Millisecond
Minute = 60 * Second
Hour = 60 * Minute
)
那么我們看下面一段代碼:
func Test() {
var waitFiveHundredMillisections int64 = 500
startingTime := time.Now().UTC()
time.Sleep(10 * time.Millisecond)
endingTime := time.Now().UTC()
var duration time.Duration = endingTime.Sub(startingTime)
var durationAsInt64 = int64(duration)
if durationAsInt64 >= waitFiveHundredMillisections {
fmt.Printf("Time Elapsed : Wait[%d] Duration[%d]\n", waitFiveHundredMillisections, durationAsInt64)
} else {
fmt.Printf("Time DID NOT Elapsed : Wait[%d] Duration[%d]\n", waitFiveHundredMillisections, durationAsInt64)
}
}
以上代碼運(yùn)行后的輸出為:
Time Elapsed : Wait[500] Duration[10724798]
也就是說,定義的500毫秒已經(jīng)用完了?當(dāng)我們?cè)俅尾榭碊uration類型的定義,可以發(fā)現(xiàn)Duration類型匯總基本單位時(shí)間是納秒(Nanosecond),所以講一個(gè)表示10毫秒的Durantion類型對(duì)象轉(zhuǎn)換為int64類型時(shí),實(shí)際上得到的是10,000,000。因此,直接轉(zhuǎn)換是不行的,需要一個(gè)不同的策略來使用和轉(zhuǎn)換Duration類型。
首先,我我們可以基于Duration中定義的常量,創(chuàng)建下面這樣的一個(gè)Duration變量:
func Test() {
var duration_Milliseconds time.Duration = 500 * time.Millisecond
var duration_Seconds time.Duration = (1250 * 10) * time.Millisecond
var duration_Minute time.Duration = 2 * time.Minute
fmt.Printf("Milli [%v]\nSeconds [%v]\nMinute [%v]\n", duration_Milliseconds, duration_Seconds, duration_Minute)
}
在上面代碼中,我們創(chuàng)建了3個(gè)Duration類型的變量,通過使用時(shí)間常數(shù),創(chuàng)建正確的持續(xù)時(shí)間值,然后使用標(biāo)準(zhǔn)庫函數(shù)Printf和%v操作符,得到下面的輸出結(jié)果:
Milli [500ms]
Seconds [12.5s]
Minute [2m0s]
Printf函數(shù)知道如何本地化顯示一個(gè) Duration 類型,它基于 Duration 類型中的每一個(gè)值,選擇合適的格式進(jìn)行時(shí)間的顯示。
實(shí)際上,Duration類型擁有一些邊界的類型轉(zhuǎn)換函數(shù),他們能將Duration類型轉(zhuǎn)化為Go預(yù)研的內(nèi)建類型int64或float64,例如:
func Test() {
var duration_Seconds time.Duration = (1250 * 10) * time.Millisecond
var duration_Minute time.Duration = 2 * time.Minute
var float64_Seconds float64 = duration_Seconds.Seconds()
var float64_Minutes float64 = duration_Minute.Minutes()
fmt.Printf("Seconds [%.3f]\nMinutes [%.2f]\n", float64_Seconds, float64_Minutes)
}
需要注意的是,在時(shí)間轉(zhuǎn)換函數(shù)中,并沒有轉(zhuǎn)換毫秒值的函數(shù),上述代碼只使用 Seconds 和 Minutes 函數(shù),得到了如下輸出:
Seconds [12.500]
Minutes [2.00]
當(dāng)我們需要轉(zhuǎn)換毫秒值,但包里面單單沒有提供毫秒值的裝換呢? Go 語言的設(shè)計(jì)者希望我有更多的選擇,而不只是將毫秒值轉(zhuǎn)換成某種單獨(dú)的內(nèi)建類型。下面的代碼中,我將毫秒值轉(zhuǎn)化為了 int64 類型和 float64 類型:
func Test() {
var duration_Milliseconds time.Duration = 500 * time.Millisecond
var castToInt64 int64 = duration_Milliseconds.Nanoseconds() / 1e6
var castToFloat64 float64 = duration_Milliseconds.Seconds() * 1e3
fmt.Printf("Duration [%v]\ncastToInt64 [%d]\ncastToFloat64 [%.0f]\n", duration_Milliseconds, castToInt64, castToFloat64)
}
我們將納秒值除以1e6得到了int64類型表示的毫秒值,將秒值乘以1e3,我們得到了float64類型表示的毫秒值,上面代碼的輸出如下:
Duration [500ms]
castToInt64 [500]
castToFloat64 [500]
那么,我們可以將最開始的測(cè)試代碼修改如下:
func Test() {
var waitFiveHundredMillisections time.Duration = 500 * time.Millisecond
startingTime := time.Now().UTC()
time.Sleep(600 * time.Millisecond)
endingTime := time.Now().UTC()
var duration time.Duration = endingTime.Sub(startingTime)
if duration >= waitFiveHundredMillisections {
fmt.Printf("Wait %v\nNative [%v]\nMilliseconds [%d]\nSeconds [%.3f]\n", waitFiveHundredMillisections, duration, duration.Nanoseconds()/1e6, duration.Seconds())
}
}
得到輸出如下:
Wait 500ms
Native [601.091066ms]
Milliseconds [601]
Seconds [0.601]
補(bǔ)充:golang time.Duration 自定義變量報(bào)錯(cuò)解決
對(duì)于time.Duration類型,如果采用 time.Duration類型 * int變量 會(huì)報(bào)錯(cuò),而直接和數(shù)字相乘則不會(huì)出現(xiàn);
具體是為什么呢?怎么解決呢?
錯(cuò)誤:
Invalid operation: time.Millisecond * idcTimeOut (mismatched types Duration and int64)
原因:因?yàn)轭愋筒黄ヅ?,time.Duration類型 不能直接和 int類型相乘,需要先將變量轉(zhuǎn)換為time.Duration
解決方式:
time.Duration(int變量))
代碼如下:
idc := getIdc()
var idcTimeOut int64
if _, ok := IdcTimeout[idc]; ok {
idcTimeOut = IdcTimeout[idc]
} else {
idcTimeOut = AllTimeout
}
//錯(cuò)誤寫法
time.After(time.Millisecond * idcTimeOut
//正確寫法
time.After(time.Millisecond * time.Duration(idcTimeOut))
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- golang 定時(shí)任務(wù)方面time.Sleep和time.Tick的優(yōu)劣對(duì)比分析
- 解決Golang time.Parse和time.Format的時(shí)區(qū)問題
- 解決golang時(shí)間字符串轉(zhuǎn)time.Time的坑
- golang的時(shí)區(qū)和神奇的time.Parse的使用方法
- 對(duì)Golang中的runtime.Caller使用說明
- golang time包做時(shí)間轉(zhuǎn)換操作
- golang xorm及time.Time自定義解決json日期格式的問題
- golang time常用方法詳解