Skip to main content

时间戳解析

· 2 min read

首先,我们要理解时间戳的概念

然而前端获取的时间戳却是毫秒级的(13位):

不管是s级、ms级、还是us级 时间戳都是int64位的

所以问题转化为如何把 int64转化为 time.Time

time包提供了下面3个api,分别针对不同的时间单位:

  • func Unix(sec int64, nsec int64) Time: s
  • func UnixMilli(msec int64) Time:ms
  • func UnixMicro(usec int64) Time:us

我们要做的就是选择正确的API,那么如何选择呢?

我们可以根据时间戳的位数来判断,假设n为时间戳:

s => 10位 time.Unix(n,0)

ms => 13位 time.UnixMilli(n)

us => 16位 time.UnixMicro(n)

EXAMPLE:

package main

import (
"time"
"fmt"
)

func main() {
var n int64 = 1631504561000;
var t = time.Unix(n,0) //处理秒级的n
fmt.Println(t.Format("2006-01-02 15:04:05")) //53670-04-27 23:23:20 发现结果不对


var t1 = time.UnixMilli(n) //处理ms级的 go version go1.17 才有这个api
fmt.Println(t1.Format("2006-01-02 15:04:05")) //2021-09-13 11:42:41
}