如何将非常大的 (>max(int64)) 纳秒 unix 时间戳转换为 time.Time
How do you convert a very large (>max(int64)) nanosecond unix timestamp to time.Time
我有一个 uint64 纳秒 unix 时间戳,它大于 int64 可以容纳的最大值。由于我不能再使用采用 int64 的 time.Unix() 函数,我如何才能将此时间戳转换为时间而不丢失数据?
time.Unix()
函数有两个参数:
func Unix(sec int64, nsec int64) Time
如果您有 int64
纳秒,您可以为 sec
传递 0
,为 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 上试试。
我有一个 uint64 纳秒 unix 时间戳,它大于 int64 可以容纳的最大值。由于我不能再使用采用 int64 的 time.Unix() 函数,我如何才能将此时间戳转换为时间而不丢失数据?
time.Unix()
函数有两个参数:
func Unix(sec int64, nsec int64) Time
如果您有 int64
纳秒,您可以为 sec
传递 0
,为 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 上试试。