你如何将一个非常大的 (>max(int64)) 纳秒 unix 时间戳转换为 time.Time

vdd*_*dox 3 time epoch go

我有一个 uint64 纳秒 unix 时间戳,它大于 int64 可以容纳的最大值。由于我无法再使用采用 int64 的 time.Unix() 函数,如何将此时间戳转换为 Time 而不丢失数据?

icz*_*cza 6

time.Unix()函数采用 2 个参数:

func Unix(sec int64, nsec int64) Time
Run Code Online (Sandbox Code Playgroud)

如果你有int64纳秒,你可以传递0sec,而纳秒重视nsec。例如:

nsec := int64(1623840300988135567)
t := time.Unix(0, nsec)
fmt.Println(t) // 2021-06-16 10:45:00.988135567 +0000 UTC
Run Code Online (Sandbox Code Playgroud)

传递超出范围 [0, 999999999] 的纳秒值是有效的。

如果您的纳秒值不适合int64,则只需将其分为两部分:秒和剩余的纳秒。打破它只是简单地除以得到除以的余数1e9(即一秒内的纳秒数)。

例如:

x := uint64(math.MaxInt64)
t = time.Unix(0, int64(x))
fmt.Println(t)

x += uint64(time.Hour)
t = time.Unix(int64(x/1e9), int64(x%1e9))
fmt.Println(t)
Run Code Online (Sandbox Code Playgroud)

添加time.Hourmath.MaxInt64显然不适合int64. 然而上面的代码运行良好并输出:

2262-04-11 23:47:16.854775807 +0000 UTC
2262-04-12 00:47:16.854775807 +0000 UTC
Run Code Online (Sandbox Code Playgroud)

Go Playground上试一试。