web-dev-qa-db-ja.com

ミリ秒からGolangの時間に変換

lastModifedというフィールドがミリ秒単位で含まれているjsonデータがあります。このデータを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();から取得されます

14
sadlil

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

27
RoninDev