20

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

查看时间包,我看到了该Parse功能,但布局似乎都是基于时区的正常时间。进入 Time 对象后,我可以使用它Format(Time.Stamp)来获取我想要的输出,但我不清楚如何将字符串放入 Time 对象中。

4

4 回答 4

40

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

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
}

查看http://play.golang.org/p/M1dWGLT8XE以现场玩示例。

于 2012-11-08T18:13:02.313 回答
4

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
}
于 2021-10-07T13:10:39.617 回答
3

接受的答案不适用于某些日期范围,无论是在未来太远还是在过去太远,因为只能使用 64 位(从 Epoch 起正负 300 年)来描述有限的日期范围。

这将适用于毫秒描述的整个范围:

var Epoch = time.Unix(0, 0)

func ParseMillisecondUnixTimestamp(s string) (time.Time, error) {
    ts, err := strconv.Atoi(s)
    if err != nil {
        return time.Time{}, err
    }

    return Epoch.Add(time.Duration(ts) * time.Millisecond), nil
}
于 2020-07-29T03:15:22.373 回答
-1

使用time.Unix(ms/1000, 0)就可以了。

首先使用众所周知的关系将 ms-timestamp 转换为 unix-timestamp 1 s = 1000 ms,然后将结果用作time.Unix函数的第一个参数

于 2020-04-30T20:23:14.900 回答