Gorm格式化时间输出的另一种实现
咻兔哔 / 技术文章

Gorm读取的时间都是带有时区的,不符合我们使用的 2024-07-22 15:59:13 这种格式, 看了很多方式 大部分都是引用自定义类型的.今天看Gorm的文档突发其想想试试用Gorm的hook方式能不能解决这个问题.

不太喜欢gorm.model 这个结构体 定义完表 CreatedAt 和UpdatedAt都跑到前面去了,就重新写了只有时间的结构体

时间结构体
type UseDateTime struct {
  CreatedAt    *time.Time `json:"-"`
	CreatedAtStr string     `json:"created_at" gorm:"-"`
	UpdatedAt    *time.Time `json:"-"`
	UpdatedAtStr string     `json:"updated_at" gorm:"-"`
}

删除时间

type UseSoftDelete struct {
	DeletedAt *time.Time `json:"-"`
  DeleteAtStr string `json:"delete_at" gorm:"-"`
}

细心的已经发现了定义的结构体都多出来Str结尾的字符串字段, 而且tag json定义为时间的名称,gorm里面定义了忽略,意思就是只参与逻辑输出不参与数据写入和更新, 而上面的时间字段只参与存储不参与时间输出.

实现方法

然后就是使用Gorm的Hook 之 AfterFind代码如下:

// 新增更新时间处理
func (u *UseDateTime) AfterFind(tx *gorm.DB) (err error) {
	if u.CreatedAt != nil {
		u.CreatedAtStr = u.CreatedAt.Format("2006-01-02 15:04:05")
	}
	if u.UpdatedAt != nil {
		u.UpdatedAtStr = u.UpdatedAt.Format("2006-01-02 15:04:05")
	}
	return
}

// 删除时间处理
func (u *UseSoftDelete) AfterFind(tx *gorm.DB) (err error) {
	if u.DeletedAt != nil {
		u.DeletedAtStr = u.DeletedAt.Format("2006-01-02 15:04:05")
	}
	return
}

最终输出

{
  "code": 200,
  "data": [
    {
      "id": 1,
      "username": "admin",
      "created_at": "2019-10-29 00:28:05",
      "updated_at": "2024-06-13 14:09:15"
    }
  ]
}

总结

虽然不是什么高明的方法, 但是也是一种解决方法.

支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
有 0 篇文章