从毫秒转换为 Golang 中的时间
Posted
技术标签:
【中文标题】从毫秒转换为 Golang 中的时间【英文标题】:Convert to time in Golang from milliseconds 【发布时间】:2015-10-23 01:29:15 【问题描述】:我有一些 json 数据,其中有一个名为 lastModifed 的字段包含以毫秒为单位的时间。我想使用 json.UnMarshaller 将此数据转换为结构类型。我已经用 json 文件映射了该字段。但转换似乎不起作用。
IE:
我的 Json 看起来像这样:
"name" : "hello",
"lastModified" : 1438167001716
和结构看起来像
type Model struct
Name string `json:"name"`
Lastmodified time.Time `json:"lastModified"`
看起来没有正确转换时间。我怎样才能从那些毫秒那里得到时间??
注意:lastModifiedTime 的毫秒数来自 java System.currentTimeMillis();
【问题讨论】:
这个问题有很多切题的内容。 【参考方案1】:在 golang 中,time.Time
使用 RFC3339 将 JSON 编组为字符串表示形式。因此,您需要使用 int64
而不是 time.Time
解组您的 json 并自行转换:
type Model struct
Name string `json:"name"`
Millis int64 `json:"lastModified"`
func (m Model) Lastmodified() time.Time
return time.Unix(0, m.Millis * int64(time.Millisecond))
Go playground
您还可以使用time.Time
上方的特殊包装器并在那里覆盖 UnmarshalJSON:
type Model struct
Name string `json:"name"`
Lastmodified javaTime `json:"lastModified"`
type javaTime time.Time
func (j *javaTime) UnmarshalJSON(data []byte) error
millis, err := strconv.ParseInt(string(data), 10, 64)
if err != nil
return err
*j = javaTime(time.Unix(0, millis * int64(time.Millisecond)))
return nil
Go playground
【讨论】:
我认为time.Unix(0, millis * int64(time.Mllisecond))
更具可读性。 time.Unix
被明确记录为正确处理此类输入,而无需调用者首先以秒为单位拆分纳秒值。
是的,你是对的。我已经编辑了我的答案。非常感谢!
注:这对公元 1678 年至 2261 年有一个隐含的有效性限制。这在大多数情况下都很好,但至少应该注意,因为可读性较差的解决方案没有这样的限制。
我已经有 3000 年了,而且有 bug。【参考方案2】:
试试这个:
func ParseMilliTimestamp(tm int64) time.Time
sec := tm / 1000
msec := tm % 1000
return time.Unix(sec, msec*int64(time.Millisecond))
【讨论】:
【参考方案3】:可以在time
中使用UnixMilli
方法:
myTime := time.UnixMilli(myMilliseconds)
参考:https://pkg.go.dev/time#UnixMilli
【讨论】:
以上是关于从毫秒转换为 Golang 中的时间的主要内容,如果未能解决你的问题,请参考以下文章
将字节数组转换为 Golang 中的 syscall.InotifyEvent 结构
Golang:如何将 time.Time 转换为 Protobuf 时间戳?