是否可以更改gin-gionic中的默认绑定时间戳格式?

时间:2020-10-21 04:59:16

标签: json go go-gorm go-gin

我在Go语言中有一个问题,尤其是杜松子酒和gorm。

假设我有这样的模型

// Classroom struct.
type Classroom struct {
    gorm.Model
    Name      string    `json:"name"`
    Code      string    `json:"code"`
    StartedAt time.Time `json:"started_at"`
}

我要使用此JSON创建Classroom模型的数据

{
  "name": "Math",
  "code": "math-mr-robie",
  "started_at": "2020-10-10 10:00:00"
}

但是当我绑定JSON数据时,出现以下错误

parsing time ""2020-10-10 10:00:00"" as ""2006-01-02T15:04:05Z07:00"": cannot parse " 10:00:00"" as "T"

我知道出现此错误是因为我发送的格式不是time.Time的确切格式吗?

是否可以设置time.Time的默认格式?

该怎么做?

因为我尝试在time.Time之后添加.Format,但是会发生错误。

// Classroom struct.
type Classroom struct {
    gorm.Model
    Name         string `json:"name"`
    Code         string `json:"code"`
    StartedAt    time.Time.Format("2006-01-02 15:04:05") `json:"started_at"`
}

1 个答案:

答案 0 :(得分:1)

我通过创建包含内部时间的新结构JSONData解决了此问题。

// JSONData struct.
type JSONData struct {
  Time time.Time
}

在我Customize Data Types in Gorm变红并看到一些示例here之后,我添加了一些方法


// Scan JSONDate.
func (j *JSONDate) Scan(value interface{}) (err error) {
    nullTime := &sql.NullTime{}
    err = nullTime.Scan(value)
    *j = JSONDate{nullTime.Time}
    return
}

// Value JSONDate.
func (j JSONDate) Value() (driver.Value, error) {
    y, m, d := time.Time(j.Time).Date()
    return time.Date(y, m, d, 0, 0, 0, 0, time.Time(j.Time).Location()), nil
}

// GormDataType gorm common data type
func (j JSONDate) GormDataType() string {
    return "timestamp"
}

杜松子酒的东西。给了另一个resource @Eklavya。所以我添加了另一种方法。


// UnmarshalJSON JSONDate.
func (j *JSONDate) UnmarshalJSON(b []byte) error {
    s := strings.Trim(string(b), "\"")
    t, err := time.Parse(helpers.YMDHIS, s)
    if err != nil {
        return err
    }
    *j = JSONDate{
        Time: t,
    }
    return nil
}

// MarshalJSON JSONDate.
func (j JSONDate) MarshalJSON() ([]byte, error) {
    return []byte("\"" + j.Time.Format(helpers.YMDHIS) + "\""), nil
}

// Format method.
func (j JSONDate) Format(s string) string {
    t := time.Time(j.Time)
    return t.Format(helpers.YMDHIS)
}

而且有效!

相关问题