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

Я использую Go с Gin Gonic, и у меня есть что-то вроде этого:

import (
  "time"
)

type BodyType struct {
  YourDate: time.Time
}

func doThingWithPost(c *gin.Context) {
  var theBody BodyType
  c.BindJSON(&theBody)

  c.JSON(http.StatusOK, gin.H{"data": theBody.YourDate})
}

func main() {
    r.POST("/", doThingWithPost)
}

Мое намерение состояло в том, чтобы сделать тело запроса, подобное этому:

{
  YourDate: 1589887669644
}

И затем сервер автоматически получает Int, который я даю, и анализирует эту дату в формате даты time.Time, есть ли чистый способ сделать это? если я попытаюсь написать свою собственную функцию, которая получает «YourDate» типа int64 и выполняет синтаксический анализ в time.Time, буду ли я изобретать велосипед здесь?


person juan garcia    schedule 19.05.2020    source источник
comment
Если ваша цель — вывести время Unix, почему бы просто не вызвать Unix()? stackoverflow.com/q/35688419/13860   -  person Flimzy    schedule 19.05.2020
comment
@Flimzy какое-то издание сделало это название ... извините за путаницу   -  person juan garcia    schedule 19.05.2020
comment
@Flimzy, у этого есть еще одна проблема, если вы сделаете это, проверка типа в запросе будет делегирована моему собственному синтаксическому анализатору ... но если вы отправите в запросе строку вместо int, сам язык решит эту проверку типа сам по себе ...   -  person juan garcia    schedule 19.05.2020


Ответы (1)


Вы можете создать собственный тип и использовать его BodyTyte struct.

type SpecialDate struct {
    time.Time
}

type BodyType struct {
    YourDate SpecialDate
}

И напишите UnmarshalJSON вместо SpecialDate, чтобы преобразовать миллисекунды в time.Time.

func (sd *SpecialDate) UnmarshalJSON(input []byte) error {
    millis, err := strconv.ParseInt(string(input), 10, 64)
    if err != nil {
        panic(err)
    }
    tm := time.Unix(0, millis*int64(time.Millisecond))
    sd.Time = tm
    return nil
}
person Eklavya    schedule 19.05.2020