Golang Go语言中Gorm 格式化时间这样处理可行不可行

发布于 1周前 作者 vueper 来自 Go语言
时间结构体
type UseDateTime struct {
  	CreatedAt    *time.Time `json:"-"`
	CreatedAtStr string     `json:"created_at" gorm:"-"`
	UpdatedAt    *time.Time `json:"-"`
	UpdatedAtStr string     `json:"updated_at" gorm:"-"`
}

结构体多添加两个字段 CreatedAtStrUpdatedAtStr用 Tag 来控制不参与存储

使用 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
}

最终输出

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

Golang Go语言中Gorm 格式化时间这样处理可行不可行

更多关于Golang Go语言中Gorm 格式化时间这样处理可行不可行的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

楼主可以同时考虑这几种方案:
1. 定义响应专用的结构体。如果嫌麻烦,可以找找看代码生成器
2. 返回 unix 时间戳

更多关于Golang Go语言中Gorm 格式化时间这样处理可行不可行的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


另外 V2EX 似乎不让用别人照片当头像(以 /settings/avatar 为准)

给 time.Time 定义个别名, 实现 MarshalJSON() ([]byte, error) Scan(value interface{}) error Value() (driver.Value, error) 三个函数, 然后用这个别名替换掉你 model 里的*time.Time 就好了

在Golang中使用Gorm进行ORM操作时,格式化时间是一个常见的需求。对于你提到的“格式化时间这样处理可行不可行”的问题,具体处理方式会影响答案,但我可以提供一个常见的、可行的方法来处理Gorm中的时间格式化。

Gorm默认使用time.Time类型来处理数据库中的时间字段。如果你需要将时间以特定格式存储或读取,你可以在模型结构体中使用自定义的时间类型,或者通过钩子(Hooks)来格式化时间。

一种常见且可行的方法是使用Gorm的ScannerValuer接口来自定义时间字段的读写。你可以创建一个自定义的时间类型,实现这两个接口,以控制时间值的序列化和反序列化。

例如,你可以创建一个CustomTime类型,它内部存储一个time.Time值,并在实现ScannerValuer接口时指定你想要的格式。这样,当Gorm将时间值写入数据库时,它会使用你指定的格式;同样,当从数据库中读取时间值时,它也会按照你指定的格式进行解析。

此外,你也可以在查询时使用Gorm的SelectScan方法来手动格式化时间字段,但这通常不如使用自定义类型来得方便和灵活。

总之,通过自定义时间类型或使用Gorm的钩子功能,你可以灵活地处理Gorm中的时间格式化问题。这种方法是可行的,并且在实际项目中得到了广泛应用。

回到顶部