在Golang中从毫秒转换为时间

时间:2015-07-31 11:22:08

标签: json go unmarshalling

我有一些json数据,其中有一个名为 lastModifed 的字段包含以毫秒为单位的时间。我想用json.UnMarshaller将这些数据转换为结构类型。我用json提交了字段。但转换似乎无效。

IE:

我的Json看起来像这样:

{
   "name" : "hello",
   "lastModified" : 1438167001716
}

和struct看起来像

type Model struct {
    Name         string    `json:"name"`
    Lastmodified time.Time `json:"lastModified"`
}

看起来没有正确地转换时间。我怎样才能从那些毫克中获得时间?

注意:lastModifiedTime的millis来自java System.currentTimeMillis();

2 个答案:

答案 0 :(得分:21)

在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

答案 1 :(得分:1)

试试这个:

func ParseMilliTimestamp(tm int64) time.Time {
    sec := tm / 1000
    msec := tm % 1000
    return time.Unix(sec, msec*int64(time.Millisecond))
}