gorm 怎么把时间戳自动转换成 yyyy-mm-dd HH:ii:ss 这种格式
时间: 2024-05-16 10:15:26 浏览: 297
在 GORM 中,可以使用 struct 中的 `time.Time` 类型和 `gorm:"type:timestamp"` tag 来表示时间戳类型的字段。如果要将时间戳自动转换成 `yyyy-mm-dd HH:ii:ss` 格式,可以使用 `time.Time` 的 `Format` 方法进行格式化。
以下是一个示例代码,假设我们有一个 `User` struct:
```go
import "time"
type User struct {
ID uint `gorm:"primary_key"`
Name string `gorm:"type:varchar(100)"`
CreatedAt time.Time `gorm:"type:timestamp"`
}
```
在查询或创建记录时,`CreatedAt` 字段将自动转换为时间戳。如果要在查询结果中将时间戳格式化成 `yyyy-mm-dd HH:ii:ss`,可以使用 GORM 的回调函数进行处理:
```go
db.Callback().Query().After("gorm:query").Register("format_time", func(scope *gorm.Scope) {
// 检查 struct 中是否有 time.Time 类型的字段
if _, ok := scope.Get("gorm:query_destination"); !ok {
return
}
if _, ok := scope.FieldByName("CreatedAt"); !ok {
return
}
// 获取查询结果中所有的记录
records := scope.Rows()
for records.Next() {
// 将记录中的时间戳字段转换为格式化的字符串
var createdAt time.Time
if err := records.Scan(&createdAt); err != nil {
continue
}
scope.Err(errors.Wrap(err, "failed to scan time.Time field"))
createdAtFormatted := createdAt.Format("2006-01-02 15:04:05")
// 将格式化后的时间字符串设置回记录中
if err := records.Scan(&createdAtFormatted); err != nil {
continue
}
scope.Err(errors.Wrap(err, "failed to scan formatted time.Time field"))
}
})
```
上述代码中,我们在 GORM 的回调函数中注册了一个 `format_time` 函数,该函数会在查询结果返回后自动执行。在函数中,我们首先检查查询结果中是否有 `CreatedAt` 字段,如果有,则将时间戳转换为格式化的字符串,并将其设置回记录中。
这样,当我们从数据库查询 `User` 记录时,`CreatedAt` 字段将会自动转换成 `yyyy-mm-dd HH:ii:ss` 格式。
阅读全文