使用 time.Now().Unix()、UnixNano()、UnixMilli() 等是否安全?整数溢出怎么办?

Shi*_*sui 0 go unix-timestamp

我在这里读到Unix() 返回的https://pkg.go.dev/time#Unixthe local Time corresponding to the given Unix time, sec seconds and nsec nanoseconds since January 1, 1970 UTC

您还可以分别使用 UnixNano() 和 UnixMilli() 获取自 1970 年以来的毫秒数或纳秒数。

我想我对这如何安全感到困惑。如果纳秒、毫秒或常规秒的数量超过 int64 的容量,是否会出现日期/时间中断?

另外,我在 go Playground https://go.dev/play/上进行了实验,通过打印出来time.Now.Unix(),我总是会得到 1257894000 秒,即使我运行代码的时间间隔大约是一分钟。

然而,如果我这样做的话,我确实看到了不同

time.Now.Unix()
time.Sleep(time.Duration(1) * time.Second)
time.Now.Unix()
Run Code Online (Sandbox Code Playgroud)

这给了我 1257894000 和 1257894001。

我很困惑 Unix 时间基本上是如何工作的。

don*_*atJ 5

Time.Unix(), Time.UnixMicro(), Time.UnixMilli(),Time.UnixNano()全部返回有符号的 int64。

有符号 int64 的最大值为 9,223,372,036,854,775,807

这意味着2920 亿年内Time.Unix()都不会用完整数。毫无疑问,它会比人类更长寿。

最坏的情况是Time.UnixNano()上的整数将用完Friday, April 11, 2262 11:47:16.854 PM GMT。我不了解你,但我会死,希望没有人会使用我的代码。