Gorm格式化时间输出的另一种实现
Gorm在读取时间时默认带有时区,不符合常规的日期格式。本文提出了一种通过自定义结构体和使用Gorm的Hook方式来解决这个问题。作者首先定义了一个只包含时间字段的结构体,并使用`Str`后缀和`json`标签来指定时间字段只参与存储而不参与数据输出。接着,通过Gorm的Hook机制实现时间字段的格式化。虽然这种方法不是特别高明,但确实提供了一种有效的解决方案。

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"
    }
  ]
}

总结

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

咻兔哔
咻兔哔·2024年7月22日

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处

推荐文章

构建现代化个人博客系统:技术亮点与创新实践
后端技术

构建现代化个人博客系统:技术亮点与创新实践

本文介绍了作者构建现代化个人博客系统的技术选型、架构设计和创新实践。核心亮点包括采用Go+Nuxt.js+Vue3技术栈,实现高性能、可扩展的博客平台;创新功能如AI智能摘要生成系统、高性能全文搜索、现代化文件上传系统;微服务化架构、容器化部署及多层次安全防护;性能优化策略如缓存策略、数据库优化和前端性能优化。此外,还展示了智能简历模块、Waline评论系统及多主题支持等特色功能,系统性能指标优异。作者分享了技术收获与未来规划,旨在帮助全栈开发者提升技术能力。

12月10日56
本站更换了新的技术栈
后端技术

本站更换了新的技术栈

本文介绍了基于Go+Nuxt.js+Vue3技术栈构建的现代化个人博客系统。该系统采用微服务架构,包含前台展示、后台管理和API服务三大模块,支持容器化部署,具备高性能与高可用性。后端使用Go、Gin、GORM等技术,前端采用Nuxt.js+Vue3+TailwindCSS,并集成AI智能摘要生成、全文搜索、文件上传等核心功能。系统注重安全设计,实施JWT认证、XSS防护等措施,同时通过Redis缓存、CDN加速等策略优化性能。整体架构展示了现代Web开发的最佳实践,为同类项目提供参考价值。

12月10日45
Golang三方库收集-不定期更新
后端技术

Golang三方库收集-不定期更新

以下是一些热门的第三方库,包括网络请求库、RPC库、Web框架、热重启库、定时任务库、获取机器状态库、JWT库、验证码库、邮件库、汉字转拼音库、消息队列库、随机数库、Redis客户端库、雪花 ID 生成器库、Excel处理库、WEB框架库、数据库库、配置库、REDIS库、工具包库、参数验证库、日志库、JSON库、协程池库和类型转换库。这些库各有特色,适用于不同的开发场景,值得一试。

7月28日25
laravel代码整洁之道
后端技术

laravel代码整洁之道

2月10日29