如何将日期字符串绑定到结构?

How do I bind a date string to a struct?

type TestModel struct {
  Date     time.Time `json:"date" form:"date" gorm:"index"`
  gorm.Model
}

我正在使用 echo 框架,并且 我有一个像上面的结构,我得到了像 '2021-09-27' 这样的字符串数据,我怎样才能将它绑定到结构?

func CreateDiary(c echo.Context) error {
    var getData model.TestModel
    if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
        fmt.Print(err.Error())
    }
   return c.JSON(200, getData)
}

当我这样编码时,出现以下错误:

code=400, message=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T", internal=parsing time "2021-09-27" as "2006-01-02T15:04:05Z07:00": cannot parse "" as "T"

我是一个golang初学者,请问能不能举个简单的例子??

我正在使用 echo 框架

这里是回显中使用的可用标签列表。如果要从 body 解析,则使用 json

  • query - 来源为请求查询参数。
  • param - source 是路由路径参数。
  • header - 源是 header 参数。
  • 表格 - 来源是表格。值取自查询和请求 body。使用 Go 标准库形式解析。
  • json - 来源是请求 body。使用 Go json 包进行解组。
  • xml - 来源是请求 body。使用 Go xml 包进行解组。

您需要将 time.Time 包装到自定义结构中,然后实现 json.Marshaler and json.Unmarshaler 接口

例子

package main

import (
    "fmt"
    "strings"
    "time"

    "github.com/labstack/echo/v4"
)

type CustomTime struct {
    time.Time
}

type TestModel struct {
    Date CustomTime `json:"date"`
}

func (t CustomTime) MarshalJSON() ([]byte, error) {
    date := t.Time.Format("2006-01-02")
    date = fmt.Sprintf(`"%s"`, date)
    return []byte(date), nil
}

func (t *CustomTime) UnmarshalJSON(b []byte) (err error) {
    s := strings.Trim(string(b), "\"")

    date, err := time.Parse("2006-01-02", s)
    if err != nil {
        return err
    }
    t.Time = date
    return
}

func main() {
    e := echo.New()
    e.POST("/test", CreateDiary)
    e.Logger.Fatal(e.Start(":1323"))
}

func CreateDiary(c echo.Context) error {
    var getData TestModel
    if err := (&echo.DefaultBinder{}).BindBody(c, &getData); err != nil {
        fmt.Print(err.Error())
    }
    return c.JSON(200, getData)
}

测试

curl -X POST http://localhost:1323/test -H 'Content-Type: application/json' -d '{"date":"2021-09-27"}'

键入 CustomTime time.Time

func (ct *CustomTime) UnmarshalParam(param string) error {
    t, err := time.Parse(`2006-01-02`, param)
    if err != nil {
        return err
    }
    *ct = CustomTime(t)
    return nil
}

参考:https://github.com/labstack/echo/issues/1571