gorm自定义时间类型存取
由于 Go 自身的 time.Time 时间类型默认解析的格式与前端所传的格式(yy-mm-dd HH:ii:ss)不同,使用gin框架和gorm框架进行解析会存在问题,需要自定义时间类型
package main
import (
"database/sql/driver"
"errors"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
"time"
)
var GDB *gorm.DB
const TimeFormat = "2006-01-02 15:04:05"
type Time time.Time
func (t *Time) UnmarshalJSON(data []byte) (err error) {
if len(data) > 2 && data[0] == '"' {
now, err := time.ParseInLocation(`"`+TimeFormat+`"`, string(data), time.Local)
*t = Time(now)
return err
}
return
}
func (t Time) MarshalJSON() ([]byte, error) {
if time.Time(t).IsZero() {
return []byte("\"\""), nil
}
b := make([]byte, 0, len(TimeFormat)+2)
b = append(b, '"')
b = time.Time(t).AppendFormat(b, TimeFormat)
b = append(b, '"')
return b, nil
}
func (t Time) String() string {
return time.Time(t).Format(TimeFormat)
}
// Value insert timestamp into mysql need this function.
func (t Time) Value() (driver.Value, error) {
if time.Time(t).IsZero() {
return nil, nil
}
return time.Time(t), nil
}
// Scan value of time.Time
func (t *Time) Scan(value interface{}) error {
timeValue, ok := value.(time.Time)
if !ok {
return errors.New(fmt.Sprint("Failed to unmarshal time value:", value))
}
*t = Time(timeValue)
return nil
}
func main() {
GDB = getDB()
// 创建一个默认的路由引擎
r := gin.Default()
// GET:请求方式;/hello:请求的路径
// 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数
r.POST("/dev", func(c *gin.Context) {
type User struct {
CreateTime Time `json:"create_time"`
}
var user User
if err := c.ShouldBindJSON(&user);err != nil{
fmt.Println(err)
} else {
GDB.Create(&user)
var fUser User
GDB.Model(&user).Find(&fUser)
c.JSON(200, gin.H{
"user": fUser,
})
}
})
// 启动HTTP服务,默认在0.0.0.0:8080启动服务
r.Run()
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战