這樣。不過只是個(gè)精確到納秒的計(jì)時(shí)器,不是精確到納秒的當(dāng)前時(shí)間。windows好像只能拿到ms精度的當(dāng)前時(shí)間吧,不是很清楚。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了泉州免費(fèi)建站歡迎大家使用!
package main
import (
"syscall"
"time"
"unsafe"
)
func NewStopWatch() func() time.Duration {
var QPCTimer func() func() time.Duration
QPCTimer = func() func() time.Duration {
lib, _ := syscall.LoadLibrary("kernel32.dll")
qpc, _ := syscall.GetProcAddress(lib, "QueryPerformanceCounter")
qpf, _ := syscall.GetProcAddress(lib, "QueryPerformanceFrequency")
if qpc == 0 || qpf == 0 {
return nil
}
var freq, start uint64
syscall.Syscall(qpf, 1, uintptr(unsafe.Pointer(freq)), 0, 0)
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(start)), 0, 0)
if freq = 0 {
return nil
}
freqns := float64(freq) / 1e9
return func() time.Duration {
var now uint64
syscall.Syscall(qpc, 1, uintptr(unsafe.Pointer(now)), 0, 0)
return time.Duration(float64(now-start) / freqns)
}
}
var StopWatch func() time.Duration
if StopWatch = QPCTimer(); StopWatch == nil {
// Fallback implementation
start := time.Now()
StopWatch = func() time.Duration { return time.Since(start) }
}
return StopWatch
}
func main() {
// Call a new stop watch to create one from this moment on.
watch := NewStopWatch()
// Do some stuff that takes time.
time.Sleep(1)
// Call the stop watch itself and it will return a time.Duration
dur := watch()
}
這和語言沒關(guān)系,操作系統(tǒng)要提供這樣的原語。linux和windows都是可以的。
如果有用到AddDate的,有三條建議:
不要用AddDate對月進(jìn)行加減操作
不要用AddDate對月進(jìn)行加減操作
不要用AddDate對月進(jìn)行加減操作
有一個(gè)需求需要對傳入的時(shí)間減去一個(gè)月,拿到上一個(gè)月的年月(如:2006-01),再進(jìn)行操作。
那么就: str := date.AddDate(0,-1,0).Format("2006-01") 很完美的樣子。
2018-05-30 加一個(gè)月變成了2018-07-01。
看一下官方文檔:
AddDate會將結(jié)果規(guī)范化,類似Date函數(shù)的做法。因此,舉個(gè)例子,給時(shí)間點(diǎn)October 31添加一個(gè)月,會生成時(shí)間點(diǎn)December 1。(從時(shí)間點(diǎn)November 31規(guī)范化而來)
所以當(dāng)你給month加 1,day 是不會變的。5-31變成 6-31,最后轉(zhuǎn)化為 7-1。
所以大家在用任何官方、非官方的接口,都一定要仔細(xì)閱讀接口文檔呀,不然很容易出問題。
一定要慎用AddDate,尤其是對年和月直接進(jìn)行加減操作的。
在Go語言中,時(shí)間包提供了確定和查看時(shí)間的函數(shù)。 Go語言中的Time.Add()函數(shù)用于添加規(guī)定的時(shí)間和持續(xù)時(shí)間。此外,此函數(shù)在時(shí)間包下定義。在這里,您需要導(dǎo)入“time”包才能使用這些函數(shù)。
用法:
在此,“t”是規(guī)定的時(shí)間,“d”是要添加到規(guī)定時(shí)間的持續(xù)時(shí)間。
返回值: 它返回將指定的t和d相加的結(jié)果。
例:
輸出:
此處,返回的輸出采用上述UTC格式。
全球以英國倫敦格林威治作為零度經(jīng)線的起點(diǎn),每隔15經(jīng)度為一個(gè)時(shí)區(qū),15度經(jīng)線為該時(shí)區(qū)的中央經(jīng)線,共分為24個(gè)時(shí)區(qū)。由西向東每隔15經(jīng)度增加一個(gè)時(shí)區(qū),相反的,每向西15經(jīng)度減少一個(gè)時(shí)區(qū)。中國所在時(shí)區(qū)為東8區(qū)。
當(dāng)前時(shí)間 time.Now() 返回的是當(dāng)?shù)貢r(shí)區(qū)的時(shí)間:
CST可以代表如下四個(gè)不同的時(shí)區(qū):
time.Now() 返回的 +0800 CST 表示的就是中國標(biāo)準(zhǔn)時(shí)間,與UTC時(shí)間有如下的轉(zhuǎn)化:
Wall Clocks表示掛鐘時(shí)間,存儲的是自1970 年 1 月 1 日 0 時(shí) 0 分 0 秒以來的時(shí)間戳,當(dāng)系統(tǒng)和授時(shí)服務(wù)器進(jìn)行校準(zhǔn)時(shí)間時(shí)間操作時(shí),有可能造成這一秒是2018-1-1 00:00:00,而下一秒變成了2017-12-31 23:59:59的情況。
Monotonic Clocks,意思是單調(diào)時(shí)間的,所謂單調(diào),就是只會不停的往前增長,不受校時(shí)操作的影響,這個(gè)時(shí)間是自進(jìn)程啟動以來的秒數(shù)。
time.Now() 返回的 m=+0.004002201 就是表示Monotonic Clocks
go語言中如果不設(shè)置指定的時(shí)區(qū),通過 time.Now() 獲取到的就是本地時(shí)區(qū)
設(shè)置時(shí)區(qū)有兩種方式:
固定時(shí)區(qū)到東八區(qū)。但這種不是對程序的全局設(shè)置,每次獲取時(shí)都需要固定時(shí)區(qū)
加載指定時(shí)區(qū)。但如果沒有g(shù)o環(huán)境使用這種方式就會加載失敗,因?yàn)闀r(shí)區(qū)信息是放在go的安裝包中的。
如果你用第二種方式加載時(shí)區(qū),在打docker鏡像時(shí)就需要進(jìn)行時(shí)區(qū)相關(guān)的配置,配置文件如下:
參考文章: