从毫秒转换为 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 中的时间的主要内容,如果未能解决你的问题,请参考以下文章

将 nil 接口转换为 Golang 中的指针?

将字节数组转换为 Golang 中的 syscall.InotifyEvent 结构

Golang:如何将 time.Time 转换为 Protobuf 时间戳?

golang 从文件中读取字节并将其转换为字符串

在 GoLang 中将字节切片“[]uint8”转换为 float64

将 URL.Query(切片映射)转换为 struct golang