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"
}
]
}
总结
虽然不是什么高明的方法, 但是也是一种解决方法.