微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

解决方法

time.Unix() 函数接受 2 个参数:

func Unix(sec int64,nsec int64) Time

如果您有 int64 纳秒,您可以为 0 传递 sec,为 nsec 传递纳秒值。例如:

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

在 [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)

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

2262-04-11 23:47:16.854775807 +0000 UTC
2262-04-12 00:47:16.854775807 +0000 UTC

Go Playground 上试试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。