自纪元以来,我有一个毫秒的字符串(它最初来自一个java.lang.System.currentTimeMillis()
电话)。在 Go 中将此字符串转换为人类可读的时间戳字符串的正确方法是什么?
查看时间包,我看到了该Parse
功能,但布局似乎都是基于时区的正常时间。进入 Time 对象后,我可以使用它Format(Time.Stamp)
来获取我想要的输出,但我不清楚如何将字符串放入 Time 对象中。
自纪元以来,我有一个毫秒的字符串(它最初来自一个java.lang.System.currentTimeMillis()
电话)。在 Go 中将此字符串转换为人类可读的时间戳字符串的正确方法是什么?
查看时间包,我看到了该Parse
功能,但布局似乎都是基于时区的正常时间。进入 Time 对象后,我可以使用它Format(Time.Stamp)
来获取我想要的输出,但我不清楚如何将字符串放入 Time 对象中。
格式字符串自纪元以来不支持毫秒,因此需要手动解析。例如:
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以现场玩示例。
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
}
接受的答案不适用于某些日期范围,无论是在未来太远还是在过去太远,因为只能使用 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
}
使用time.Unix(ms/1000, 0)
就可以了。
首先使用众所周知的关系将 ms-timestamp 转换为 unix-timestamp 1 s = 1000 ms
,然后将结果用作time.Unix
函数的第一个参数