Конвертировать во время в Golang из миллисекунд

у меня есть некоторые данные json, где есть поле под названием lastModifed содержит время в миллисе. Я хотел преобразовать эти данные в тип структуры с помощью json.Он вызывается. Я сопоставил поле с файлом json. Но преобразование, кажется, не работает.

IE:

мой Json выглядит так:

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

и структура выглядит так:

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

выглядит не преобразование времени должным образом. как я могу получить от них время? Миллис??

NB: Миллис lastModifiedTime получают от java System.currentTimeMillis();

2 ответов


в golang time.Time маршалы в JSON с помощью RFC3339, строковое представление. Таким образом, вам нужно unmarshal ваш json с помощью int64 вместо time.Time и конвертировать после него самостоятельно:

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


Я понимаю, что это старый вопрос, и принятый ответ, К сожалению, по-прежнему правильный. Если кто-то приходит сюда, имея дело с этой проблемой, пожалуйста, перейдите к этому вопрос и оставить комментарий или плюс один. Основная команда Go, похоже, считает, что отсутствие поддержки эпох UNIX в миллисекундах приемлемо, потому что они не верят, что программисты Go используют этот формат. Заранее спасибо за поддержку!