东林博客

Go time内核包:秒、毫秒、纳秒时间戳实测输出

10位数的时间戳是以 秒 为单位;

13位数的时间戳是以 毫秒 为单位;

19位数的时间戳是以 纳秒 为单位;

1秒 = 1000毫秒

1毫秒 = 1000微秒

1微秒 = 1000纳秒

所以 1秒(s)=1000000000纳秒(ns)

package main

import (
   "fmt"
   "time"
)

func main(){
   fmt.Printf("本地时间:%v\n",time.Now().Format("2006-01-02 15:04:05"))
   fmt.Printf("时间戳(秒):%v;\n",time.Now().Unix());
   fmt.Printf("UTC时间:%v;\n",time.Now().UTC());
   fmt.Printf("时间戳(纳秒):%v;\n",time.Now().UnixNano())
}

打印结果:

本地时间:2019-08-03 09:25:47
时间戳(秒):1564795547;
UTC时间:2019-08-03 01:25:47.205063 +0000 UTC;
时间戳(纳秒):1564795547205109000;

从结果中可以看到,time.Now().Unix() 获取的是当前运行系统的UTC时间戳(秒)。因为我系统设置的是UTC +8:00 , 所以默认返回的就是北京时间。

纳秒,一纳秒是一秒的10亿分之一,可以说是成为唯一键生成因素最好的选择之一。那么在高并发情况下,使用纳秒来作为唯一键,真的靠谱吗?

我是看到了《golang 使用UnixNano()作为唯一键id,在高并发环境下到底安不安全》,原文中作者得出的结论是不安全,存在重复键,有网友指证他的实验有问题,因为是在windows平台测试的。所以我原样拿着他的测试代码来运行一下,一字不改:

package main

import (
   "fmt"
   "github.com/fwhezfwhez/go-queue"
   "runtime"
   "strconv"
   "sync"
   "time"
)
var mutex sync.Mutex

func init() {
   fmt.Print(time.Now().UnixNano())
}
func main() {
   runtime.GOMAXPROCS(runtime.NumCPU())
   wg :=sync.WaitGroup{}


   var queue = Queue.NewEmpty()
   //var rs = make([]int64,0)
   for i:=0;i<5000;i++ {
      wg.Add(1)
      go func(in int,q *Queue.Queue){
         tmp:= getNum()
         //add(&rs, tmp)
         q.SafePush(tmp)
         fmt.Println("finish "+strconv.Itoa(in)+",produce:"+strconv.FormatInt(tmp,10))
         wg.Done()
      }(i,queue)
   }
   wg.Wait()
   queue.Print()
   fmt.Print(queue.ValidLength())
   //fmt.Println(rs)
   //fmt.Println(len(rs))
}

func getNum()int64{
   mutex.Lock()
   defer mutex.Unlock()
   return time.Now().UnixNano()
}
func add(rs *[]int64,i int64){
   mutex.Lock()
   defer mutex.Unlock()
   *rs = append(*rs,i)
}

//---------------------
//作者:fwhezfwhez
//来源:CSDN
//原文:https://blog.csdn.net/fwhezfwhez/article/details/81069249
//版权声明:本文为博主原创文章,转载请附上博文链接!


执行的结果为:

可以看到,执行结果中每个结果都是不同的。

{{tip}}