gorm time json格式化

gorm 默认 Model

type Model struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt time.Time
	UpdatedAt time.Time
	DeletedAt DeletedAt `gorm:"index"`
}

time.Time 类型在 gorm 进行查询的返回结果,读取到的时间字段往往是这样:"2024-07-03T22:14:02.973528+08:00",带着时区和毫秒。但其实往往这样的格式,可能不是想要的。

想要变成我们想要的,看了gorm DeletedAt源码后我们可以自定义一个Model 效果跟gorm.Model一样。

package model

import (
	"database/sql"
	"database/sql/driver"
	"encoding/json"
	"fmt"
	"time"

	"gorm.io/gorm"
)

type LocalTime sql.NullTime

// Scan implements the Scanner interface.
func (n *LocalTime) Scan(value interface{}) error {
	return (*sql.NullTime)(n).Scan(value)
}

// Value implements the driver Valuer interface.
func (n LocalTime) Value() (driver.Value, error) {
	if !n.Valid {
		return nil, nil
	}
	return n.Time, nil
}

func (n LocalTime) MarshalJSON() ([]byte, error) {
	if !n.Valid {
		return json.Marshal(nil)
	}
	tTime := time.Time(n.Time)
	return []byte(fmt.Sprintf("\"%v\"", tTime.Format("2006-01-02 15:04:05"))), nil

}

func (n *LocalTime) UnmarshalJSON(b []byte) error {
	if string(b) == "null" {
		n.Valid = false
		return nil
	}
	err := json.Unmarshal(b, &n.Time)
	if err == nil {
		n.Valid = true
	}
	return err
}

type Model struct {
	ID        uint `gorm:"primarykey"`
	CreatedAt LocalTime
	UpdatedAt LocalTime
	DeletedAt gorm.DeletedAt `gorm:"index"`
}

posted @ 2024-05-20 10:33  耳东01  阅读(27)  评论(0)    收藏  举报