如何在Go中解析毫秒以来的纪元时间戳字符串?

P.T*_*.T. 12 string datetime go

自从纪元以来我有一个毫秒的字符串(最初来自一个java.lang.System.currentTimeMillis()电话).在Go中将此字符串转换为人类可读时间戳字符串的正确方法是什么?

时间包我看到了这个Parse功能,但布局似乎都是正常的基于时区的时间.一旦进入Time对象,我可以Format(Time.Stamp)用来获取我想要的输出,但我不清楚如何将字符串转换为Time对象.

Ste*_*erg 27

格式字符串不支持自纪元以来的毫秒数,因此您需要手动解析.例如:

func msToTime(ms string) (time.Time, error) {
    msInt, err := strconv.ParseInt(ms, 10, 64)
    if err != nil {
        return time.Time{}, err
    }

    return time.Unix(0, msInt*int64(time.Millisecond)), nil
}
Run Code Online (Sandbox Code Playgroud)

查看http://play.golang.org/p/M1dWGLT8XE以播放实例.

  • 为什么更多的工作更难以阅读,当stdlib为您完成时您可能会出错?从文档:`在范围[0,999999999]之外传递nsec是有效的.`https://golang.org/pkg/time/#Unix (4认同)
  • 您的解决方案有效,但它利用了“time.Unix”来容纳范围的纳秒值。您正在将毫秒转换为纳秒,但忽略了您应该真正将毫秒转换为秒和剩余的纳秒。这是您的解决方案的改编版:http://play.golang.org/p/XKHNPkSqgx。 (2认同)

ahe*_*rve 5

2021 更新:您可以使用UnixMilli从整数解析。这将改善以下问题的可接受答案:

 func msToTime(ms string) (time.Time, error) {
    msInt, err := strconv.ParseInt(ms, 10, 64)
    if err != nil {
        return time.Time{}, err
    }

    return time.UnixMilli(msInt), nil
}
Run Code Online (Sandbox Code Playgroud)