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

时间:2012-11-08 17:41:09

标签: string datetime go

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

查看the time package我看到Parse函数,但布局似乎都是基于时区的正常时间。进入Time对象后,我可以使用Format(Time.Stamp)来获取我想要的输出,但是我不清楚如何将字符串转换为Time对象。

3 个答案:

答案 0 :(得分:24)

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

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以播放示例。

答案 1 :(得分:0)

accepted answer不能在某些日期范围内使用,无论将来是太远还是过去太久,因为只能使用64位(距大纪元前后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
}

答案 2 :(得分:-1)

使用time.Unix(ms/1000, 0)可以解决问题。

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