我有一个字符串,自纪元以来有毫秒(最初来自java.lang.System.currentTimeMillis()
电话)。在Go中将此字符串转换为人类可读时间戳字符串的正确方法是什么?
查看the time package我看到Parse
函数,但布局似乎都是基于时区的正常时间。进入Time对象后,我可以使用Format(Time.Stamp)
来获取我想要的输出,但是我不清楚如何将字符串转换为Time对象。
答案 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
}
答案 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
函数的第一个参数