Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert to time in Golang from milliseconds

Tags:

I have a some json data where there is a field called lastModifed contains time in millis. I wanted to convert this data into a struct type with json.UnMarshaller. I have mapped the field with json filed. But the conversion seems not working.

IE :

My Json looks like this:

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

and struct Looks like

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

looks not converting the time properly. how can i get the time from those millis??

NB: The millis of lastModifiedTime are getting from java System.currentTimeMillis();

like image 222
sadlil Avatar asked Jul 31 '15 11:07

sadlil


People also ask

How do you convert milliseconds to hours minutes seconds?

To convert milliseconds to hours, minutes, seconds:Divide the milliseconds by 1000 to get the seconds. Divide the seconds by 60 to get the minutes. Divide the minutes by 60 to get the hours. Add a leading zero if the values are less than 10 to format them consistently.

What is time duration in Golang?

Duration has a base type int64. Duration represents the elapsed time between two instants as an int64 nanosecond count”. The maximum possible nanosecond representation is up to 290 years.


2 Answers

In golang time.Time marshals to JSON using RFC3339, string representation. So you need to unmarshal your json using int64 instead of time.Time and convert after it by yourself:

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

Also you can use special wrapper above time.Time and override UnmarshalJSON there:

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

like image 113
RoninDev Avatar answered Sep 17 '22 13:09

RoninDev


Try this:

func ParseMilliTimestamp(tm int64) time.Time {     sec := tm / 1000     msec := tm % 1000     return time.Unix(sec, msec*int64(time.Millisecond)) } 
like image 21
VadimFilin Avatar answered Sep 20 '22 13:09

VadimFilin